【问题标题】:Elasticsearch query through Java API通过 Java API 进行 Elasticsearch 查询
【发布时间】:2017-08-18 22:19:39
【问题描述】:

我正在使用以下 elasticsearch 查询来获取详细信息,

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

它工作正常并根据需要给出结果。

我想通过java执行相同的查询并得到相同的结果并尝试了以下,

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

它没有返回数据并抛出一些查询格式错误的异常。

是否有任何可用的 Java API 可以用来执行相同的查询?

注意:可以在 java api 中创建 boolquery 和聚合构建器并执行它们。我只是很好奇找到一种方法来直接通过 elasticsearch java api 执行这个查询

【问题讨论】:

  • 嗯。你不认为你给你的Java代码的那个查询的内容会很重要吗?特别是考虑到 java 告诉您该查询的格式不正确这一事实?那么...为什么您的问题中缺少该部分?
  • 我已经通过了相同的查询,该查询通过 HTTP POST 运行良好。
  • 您正在使用查询字符串常量。并且您声称该字符串中写入的内容。而不是仅仅向我们展示代码。
  • 你用的是哪个版本的es?

标签: java elasticsearch elasticsearch-dsl


【解决方案1】:

如果你真的要使用查询字符串查询,你的查询必须遵循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();

【讨论】:

    【解决方案2】:
    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();
    

    【讨论】:

      【解决方案3】:

      您应该在构建 QueryBuilder 时使用 boolQuery():

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-04
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多