java - 如何使用Java API编写此Elasticsearch查询

标签 java elasticsearch

以下查询正常工作,并返回我需要的结果。我正在努力使用JAVA API编写此代码。

{
"query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "somepath",
            "query": {
              "bool": {
                "filter": [
                  {
                    "terms": {
                      "somepath.key": ["key1", "key2", "key3"]
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
我在JAVA中使用它。我想念什么? commaSeparatedKeyString =“key1,key2,key3”
      QueryBuilders.boolQuery().must(QueryBuilders.nestedQuery(
              "somepath",
              QueryBuilders.boolQuery().filter(QueryBuilders.termsQuery("somepath.key", commaSeparatedKeyString)),
              ScoreMode.Total));

最佳答案

出于调试目的,检查正在构建的查询的JSON序列化可能会有所帮助。幸运的是,查询构建器中的toString()方法为您完成了此操作,因此您可以简单地使用System.out.println将查询构建器打印到stdout(或使用日志记录框架对其进行记录)。假设变量commaSeparatedKeyString设置为“key1,key2,key3”(听起来像是,但是您没有告诉我们),您实际上是在创建以下查询:

{
  "bool" : {
    "must" : [
      {
        "nested" : {
          "query" : {
            "bool" : {
              "filter" : [
                {
                  "terms" : {
                    "somepath.key" : [
                      "key1,key2,key3"
                    ],
                    "boost" : 1.0
                  }
                }
              ],
              "adjust_pure_negative" : true,
              "boost" : 1.0
            }
          },
          "path" : "somepath",
          "ignore_unmapped" : false,
          "score_mode" : "sum",
          "boost" : 1.0
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}
如您所见,您所需要的查询和正在构建的查询至少有两个相关的区别:
  • 在顶层,您想要的查询以"bool.filter..."开头,但是您正在使用"bool.must..."构建查询:
    QueryBuilders.boolQuery()。 必须(QueryBuilders.nestedQuery(
  • 最里面的词条查询应该有一个词条数组(key1,key2,key3)。您不能简单地用逗号分隔值传递一个字符串来实现这一点,而必须一一传递这些术语:
    termsQuery(“somepath.key”,“key1”,“key2”,“key3”))
  • 关于java - 如何使用Java API编写此Elasticsearch查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62543679/

    相关文章:

    java - 有没有办法从HashMap这样的对象中获取Java的唯一哈希码?

    java - Spring-data-elasticsearch vs elasticsearch RestHighLevelClient 客户端库

    java - 使用 Elasticsearch 的 java api 如何在索引期间映射文档 ID

    c# - ElasticSearch巢状标志C#

    elasticsearch - Elasticsearch显示查询中匹配的内容

    java - java 8 中要映射的对象数组列表

    java - AES 代码抛出 NoSuchPaddingException : Padding NoPaddin unknown

    java - 如何通过jQuery获取 Controller 中的列表

    java - 队列不循环,提前终止?

    elasticsearch - 从远程服务器将数据传递到Elasticsearch