Конструктор запросов не находит совпадений в клиенте Elasti c Search JAVA высокого уровня сброса - PullRequest
1 голос
/ 11 марта 2020

Я написал JAVA код, который запрашивает индекс поиска Elasti c (обслуживается Elasti c Cloud - хотя я не думаю, что это актуально для этого вопроса).

Без условий запроса , функция возвращает все документы в индексе, как и ожидалось.

Когда я добавляю поисковый запрос с синтаксисом QueryBuilder Elasti c (это часть клиента REST Elasti c High Level для JAVA), совпадений не найдено.

        RestHighLevelClient client = createHighLevelRestClient();
    int numberOfSearchHitsToReturn = 100; // defaults to 10

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.size(numberOfSearchHitsToReturn);
    sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); 
    String[] includeFields = colNames.toArray(new String[colNames.size()]);
    String[] excludeFields = new String[] {}; // just need an exclude field in order to call
                                                // fetchSource
    sourceBuilder.fetchSource(includeFields, excludeFields);
    sourceBuilder.from(offset);
    sourceBuilder.size(limitParam);

    sourceBuilder.query(QueryBuilders.termQuery("firstname", query));

    SearchRequest searchRequest = new SearchRequest("contacts_" + list_id).source(sourceBuilder);
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    SearchHit[] hits = searchResponse.getHits().getHits();

совпадений пусто, даже когда query = "RICARDO", и у меня действительно есть документ в этом индексе со значением "ricardo" в поле имени. Регистр не имеет значения ... установка запроса на "ricardo" также не возвращает совпадений.

Почему это так?

Это проблема с моей реализацией REST-клиента высокого уровня библиотека, потому что запрос работает как положено в POSTMAN ...

GET https://elastic:hWWVNZEk<hidden>7a6620ba18623.us-east-1.aws.found.io:9243/contacts_6/_search
{
    "query": 
    {
        "term":
        {
            "firstname":
            {
                "value": "ricardo"
            }
        }
    }
}

Действительно ли возвращает ...

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 3.5263605,
        "hits": [
            {
                "_index": "contacts_6_twtoatx8yv",
                "_type": "_doc",
                "_id": "2098",
                "_score": 3.5263605,
                "_source": {
                    "list_id": "6",
                    "contact_id": "2098",
                    "firstname": "RICARDO",
                    "middlename": "",
                    "lastname": "SMITH"
                }
            }
        ]
    }
}

1 Ответ

0 голосов
/ 19 марта 2020

Я только что попробовал ваш пример, и он работает, хотя я удалил несколько строк кода, несколько полей, которые, например, я считаю ненужными и должны помочь вам отладить проблему с вашим кодом.

Сначала позвольте мне показать вам отображение индекса, примеры документов и поисковый запрос в формате JSON, а затем я покажу, как написать тот же поисковый запрос с помощью клиента высокого уровня ES REST.

Индекс mapping

{
    "mappings": {
        "properties": {
            "firstname": {
                "type": "text"
            },
            "lastname": {
                "type": "text"
            }
        }
    }
}

Пример индекса do c

{
   "firstname" : "RICARDO",
   "lastname" : "SMITH"
}

JSON поисковый запрос

{
    "query": {
        "term": {
            "firstname": {
                "value": "ricardo"
            }
        }
    }
}

REST-код клиента высокого уровня для вышеуказанного запроса

        int numberOfSearchHitsToReturn = 100; // defaults to 10
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.size(numberOfSearchHitsToReturn);
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        sourceBuilder.from(0);
        sourceBuilder.size(10);

        sourceBuilder.query(QueryBuilders.termQuery("firstname", "ricardo"));

        SearchRequest searchRequest = new SearchRequest("so_60628247").source(sourceBuilder);
        SearchResponse searchResponse = elasticsearchClient.search(searchRequest, RequestOptions.DEFAULT);

        // parse hit

        SearchHit[] searchHits = searchResponse.getHits().getHits();

Отладчик показывает, что он возвращает результаты

show hits array isn't empty

Очень важное примечание: В целях отладки вы можете напечатайте searchRequest.source.toString(), который покажет вам поиск JSON, построенный из вашего java кода, и в моем случае он будет ниже:

 {
  "from": 0,
  "size": 10,
  "timeout": "60s",
  "query": {
    "term": {
      "firstname": {
        "value": "ricardo",
        "boost": 1.0
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...