Elasticsearch ORing和ANDing混合在"必须"询问

时间:2016-07-22 00:05:58

标签: elasticsearch lucene

我希望将所需的属性值混合为ORed的ORed。经过几次有用的评论后,我重写了这个问题并提出了这个问题:

GET /index/docs/_search
{
    "size": 20,
    "query": {
        "bool": {
           "must": [{
               "terms": {
                   "category": ["cat1", "cat2"]
               },
               "terms": {
                   "category": ["cat3"]
               }
           }]
        }
    }
}

在上面的查询中(使用" bool""必须"形式)这是否说文档必须在"类别&#34中有cat1和cat2或cat3 ;属性?

注意:这与原始问题相比有很大改动。

2 个答案:

答案 0 :(得分:0)

您使用bool查询将几种不同类型的查询组合在一起。只有当您想要添加其他查询(如过滤器)或必须不等等以及您的术语查询时,才会像使用它一样使用它。这仍然有效,但它将简单地重写为更简单的术语查询,这将花费更多的时间。

条款查询足以满足您的要求,它将返回包含类别中cat1或cat2的所有文档。

所以你的查询可能就像:

{
    "constant_score" : {
        "filter" : {
            "terms" : { "categories" : ["cat1", "cat2"]}
        }
    }
} 

如果要将其与其他查询结合使用,也可以在必须查询中使用相同的查询。

查看thisthis以供参考。

编辑:对于其他情况,即。并且您可以使用以下查询:

"query": {
    "bool": {
      "should": [
        { "match": { "category": "cat1" }},
        { "match": { "category": "cat2"   }}
    ],
      "minimum_should_match": 2 
    }
  }

您可以根据自己真正想做的事情将各种查询结合起来。弹性搜索DSL documnetation在我看来是相当全面的,你请看看。另外看this,有很多不同的方法可以做你想做的事。请记住,术语查询会查找完全匹配,即。区分大小写,而匹配查询依赖于分析的数据,因此在两种情况下结果都可能不同。

答案 1 :(得分:0)

根据您的最新评论,如果您想要和您的类别进行比较,正确的方法是使用delete[],如下所示:

bool/must

"query": { "bool": { "must": [ { "match": { "category": "cat1" }}, { "match": { "category": "cat2" }} ] } } + bool/should也可以,但minimum_should_match更简单,并且不需要您知道您有多少条款。