Запрос Elasticsearch через Java API

Я использую следующий запрос эластичного поиска, чтобы получить детали,

{
    "query": {
        "bool": {
            "must": {
                "match_all": {}
            },
            "filter": {
                "bool": {
                    "should": [
                    {"match": {
                        "val": "GET"
                    }}]
                }
            }
        }
    }
}

Он работает нормально и дает результат по мере необходимости.

Я хочу выполнить тот же запрос через Java и получить те же результаты и пробовал следующее,

 getClient().prepareSearch(esIndex)
                .setQuery(QueryBuilders.queryStringQuery(QUERY)).execute().actionGet();

Он не возвращает данные и выдает неправильный формат для некоторого формата запроса.

Есть ли доступный API Java, с помощью которого можно выполнить тот же запрос?

ПРИМЕЧАНИЕ. Существует возможность создавать конструкторы boolquery и агрегатора в Java API и выполнять их. Мне просто любопытно, чтобы найти способ выполнить этот запрос напрямую через Java-API эластичного поиска

3 ответа

Если вы действительно хотите использовать Query String Query, ваш запрос должен соответствовать Query String Syntax:

getClient().prepareSearch(esIndex)
           .setQuery(QueryBuilders.queryStringQuery("val: \"GET\""))
           .execute()
           .actionGet();

Как уже говорилось, вы должны создать свой запрос, используя предоставленные QueryBuilders вместо строк. Это сохранит ваш код чистым и читаемым даже для сложных запросов.

getClient().prepareSearch(esIndex)
           .setQuery(QueryBuilders.boolQuery()
                                  .should(QueryBuilders.matchQuery("val", "GET"))
           .execute()
           .actionGet();
BoolQueryBuilder bool       =   boolQuery();

bool.must(QueryBuilders.matchAllQuery()); 
    bool.filter(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("Val", "GET")));

    AggregationBuilder agg = AggregationBuilders.terms("").field("");

    SearchResponse reponse =    getClient().prepareSearch().setIndices("indexName").setTypes("indexType")
                .setQuery(bool).addAggregation(agg).execute().actionGet();

Вы должны использовать boolQuery() при создании QueryBuilder:

QueryBuilder qb = boolQuery()
            .must(termQuery("content", "test1"))
            .must(termQuery("content", "test4"))
            .mustNot(termQuery("content", "test2"))
            .should(termQuery("content", "test3"))
            .filter(termQuery("content", "test5"));

Официальные документы: https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-compound-queries.html

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