Поиск ElasticSearch по полям _source - PullRequest
0 голосов
/ 02 мая 2018

У меня есть требование для реализации поисковой системы. Подобно поиску Google / Yahoo, в компоненте поиска, если какой-либо ключ введен, он должен найти совпадения и отобразиться. Для этого требования я создал Spring Boot Project, интегрированный с упругим поиском.

Используя logstash, я создал индекс для своей базы данных Oracle в Elastic search., Используя приведенный ниже код, я могу получать записи на основе идентификатора индекса Elastic Search.

private final String INDEX = "bookdata";
private final String TYPE = "books";

public Map<String, Object> getBookById(String id){
    GetRequest getRequest = new GetRequest(INDEX, TYPE, id);
    GetResponse getResponse = null;
    try {
        getResponse = restHighLevelClient.get(getRequest);
    } catch (java.io.IOException e){
        e.getLocalizedMessage();
    }
    Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
    return sourceAsMap;
}

Приведенный выше код работает нормально и может получить книгу на основе ID. Но я должен Автор или Название книги.

Пожалуйста, найдите мои проиндексированные документы в Elastic search от Kibana

{
  "took": 34,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "bookdata",
        "_type": "books",
        "_id": "72c58f1a-7bfe-41be-a7f4-ee0aca3f4cf4",  //able to search by ID
        "_score": 1,
        "_source": {
          "id": "72c58f1a-7bfe-41be-a7f4-ee0aca3f4cf4",
          "title": "Java Always",  // want to search by Title
          "author": "JournalDev", // or want to search by author
          "price": 99.1
        }
      }
}

Не очень уверен, как можно в поиске по автору или названию книги.

1 Ответ

0 голосов
/ 02 мая 2018

Вам нужно использовать API поиска вместо API получения.

// create the search request
SearchRequest searchRequest = new SearchRequest(INDEX); 
searchRequest.types(TYPE);

// create the match query on the author field
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("author", "JournalDev"); 
searchSourceBuilder.query(matchQueryBuilder); 
searchRequest.source(searchSourceBuilder);

// send the request
SearchResponse searchResponse = restHighLevelClient.search(searchRequest);

// read the response
SearchHit[] searchHits = searchResponse.getHits().getHits();
for (SearchHit hit : searchHits) {
    // get each hit as a Map
    Map<String, Object> sourceAsMap = hit.getSourceAsMap();
    String documentTitle = (String) sourceAsMap.get("title");
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...