ElasticSearch поиск по полям _source

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

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

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. Но я должен указать автора или название книги.

Пожалуйста, найдите мои проиндексированные документы в эластичном поиске от 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
        }
      }
}

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

Просматривайте термины и поисковые запросы в Elasticsearch

sramalingam24 02.05.2018 04:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
1 620
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно использовать API поиска вместо Get 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");
    ...
}

следующая строка выдает ошибку getResponse = restHighLevelClient.get(searchRequest); Ошибка: The method get(GetRequest, Header...) in the type RestHighLevelClient is not applicable for the arguments (SearchRequest)

Karthikeyan 02.05.2018 05:38

Я хочу сопоставить searchResponse с Map <String, Object>

Karthikeyan 02.05.2018 05:47

Вы можете сделать это, как объяснил здесь. Я обновил свой ответ примером

Val 02.05.2018 05:53

Другие вопросы по теме