Конструктор запросов не находит совпадений в клиенте сброса высокого уровня JAVA Elastic Search
Я написал код JAVA, который запрашивает индекс эластичного поиска (обслуживаемый Elastic Cloud - хотя я не думаю, что это имеет отношение к этому вопросу).
Без условий запроса функция возвращает все документы в индексе, как и ожидалось.
Когда я добавляю поисковый запрос с синтаксисом Elastic QueryBuilder (это часть клиента REST высокого уровня Elastic для 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();
hits пуст, даже если query = "RICARDO", и у меня действительно есть документ в этом индексе со значением "ricardo" в поле firstname. Регистр не имеет значения... установка запроса на "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 ответ
Я просто попробовал ваш пример, и он работает, хотя я удалил несколько строк кода, несколько полей, которые, как я думал, например, ненужны и должны помочь вам отладить проблему с вашим кодом.
Сначала позвольте мне показать вам сопоставление индексов, образцы документов и поисковый запрос в формате JSON, а затем я покажу, как написать тот же поисковый запрос с помощью клиента высокого уровня ES REST.
Отображение индекса
{
"mappings": {
"properties": {
"firstname": {
"type": "text"
},
"lastname": {
"type": "text"
}
}
}
}
Индексировать образец документа
{
"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();
Отладчик показывает, что возвращает результаты
Очень важное примечание: в целях отладки вы можете распечататьsearchRequest.source.toString()
который покажет вам поисковый JSON, созданный из вашего java-кода, и в моем случае это ниже:
{
"from": 0,
"size": 10,
"timeout": "60s",
"query": {
"term": {
"firstname": {
"value": "ricardo",
"boost": 1.0
}
}
}
}