Конструктор запросов не находит совпадений в клиенте сброса высокого уровня 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
      }
    }
  }
}
Другие вопросы по тегам