当前位置: 首页 > 知识库问答 >
问题:

如何将elasticsearch筛选器查询与Java API结合或使用Java API

司空赞
2023-03-14

我有以下字段:

    null
        BoolQueryBuilder bqb = QueryBuilders
                .boolQuery()
                .must(QueryBuilders.termsQuery("country", "DK"));
        bqb.filter(QueryBuilders.termsQuery("media", "book"));
        bqb.filter(QueryBuilders.termsQuery("state", "inactive");

        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(bqb)
                .build();

从这个Stackoverflow问题中我可以理解的是:elasticsearch bool query Compose must with或者我应该创建如下所示的查询:

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {"country": "DK"}
                },
                {
                    "bool": {
                        "should": [
                            {
                                "bool": {
                                    "must": [
                                        {"term": {"media": "book"}},
                                        {"term": {"state": "inactive"}}
                                    ]
                                }
                            },
                            {
                                "bool": {
                                    "must": [
                                        {"term": {"media": "ebook"}},
                                        {"term": {"state": "active"}}
                                    ]
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}

这是正确的吗?如何使用Java API实现这一点?

共有1个答案

常睿范
2023-03-14

经过一些反复试验,这似乎奏效了:

        BoolQueryBuilder bqb = QueryBuilders
                .boolQuery()
                .must(QueryBuilders.termsQuery("country", "DK"));

        BoolQueryBuilder query1 = QueryBuilders.boolQuery();
        query1.filter(QueryBuilders.termsQuery("media", "book"));
        query1.filter(QueryBuilders.termsQuery("state", "inactive");

        BoolQueryBuilder query2 = QueryBuilders.boolQuery();
        query2.filter(QueryBuilders.termsQuery("media", "ebook"));
        query2.filter(QueryBuilders.termsQuery("state", "active");

        bqb.filter(QueryBuilders.boolQuery().should(query1).should(query2));

        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(bqb)
                .build();

它生成了以下查询:

{
  "bool" : {
    "must" : [
      {
        "terms" : {
          "country" : [
            "DK"
          ],
          "boost" : 1.0
        }
      }
    ],
    "filter" : [
      {
        "bool" : {
          "should" : [
            {
              "bool" : {
                "filter" : [
                  {
                    "terms" : {
                      "media" : [
                        "book"
                      ],
                      "boost" : 1.0
                    }
                  },
                  {
                    "terms" : {
                      "state" : [
                        "inactive"
                      ],
                      "boost" : 1.0
                    }
                  }
                ],
                "adjust_pure_negative" : true,
                "boost" : 1.0
              }
            },
            {
              "bool" : {
                "filter" : [
                  {
                    "terms" : {
                      "media" : [
                        "ebook"
                      ],
                      "boost" : 1.0
                    }
                  },
                  {
                    "terms" : {
                      "state" : [
                        "active"
                      ],
                      "boost" : 1.0
                    }
                  }
                ],
                "adjust_pure_negative" : true,
                "boost" : 1.0
              }
            }
          ],
          "adjust_pure_negative" : true,
          "boost" : 1.0
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}
 类似资料:
  • 我看不到任何关于何时应该使用查询或过滤器或两者结合的描述。他们之间有什么区别?谁能解释一下吗?

  • 好吧,这一个对你们中的一个超级棒的弹性搜索专家来说可能不会太难。我得到了这个嵌套查询,我希望嵌套查询在一个非嵌套字段(状态)上进行过滤。我不知道把过滤器放在哪里。我试着把它放在一个查询中(如下),但没有给出正确的结果。你能帮我吗?

  • 问题内容: 我目前正在尝试将基于Solr的应用程序迁移到Elasticsearch。 我有这个lucene查询 据我了解,这是MUST子句与布尔OR的组合: “获取所有包含(名称中包含foo AND条)或(信息中包含foo AND条)的所有文档。在此之后,按条件state = 1过滤结果,并增强具有图像的文档。” 我一直在尝试将布尔查询与MUST一起使用,但是我无法将布尔OR放入must子句中。这

  • 有没有一种方法可以在php中使用filter_var在值与正确的过滤器匹配时返回true,否则返回false? 我想得到的是: 非常感谢。

  • 我目前正在尝试将一个基于Solr的应用程序迁移到ElasticSearch。 我有这个lucene查询 根据我的理解,这是一个必须子句与布尔OR结合的组合: “获取名称中包含(foo和bar)或信息中包含(foo和bar)的所有文档。之后,根据条件筛选结果state=1,并增强具有图像的文档。” 我一直试图在MUST中使用bool查询,但未能将boolean或转换为MUST子句。以下是我的资料:

  • 将elasticsearch布尔查询与范围增强相结合 因此,我尝试添加一个增强,如下所示: 这会像我想要的那样对内容进行排序,但它也会返回与搜索项不匹配的单字匹配项。 有没有一种方法可以只增强单个单词的匹配,这些匹配也与搜索项匹配?我尝试降低值,当使用有效的(找到的)搜索项时,该值会破坏所需的排序。 似乎应该有一种方法可以使用bool进行整个