我希望将所需的属性值混合为ORed的ORed。经过几次有用的评论后,我重写了这个问题并提出了这个问题:
GET /index/docs/_search
{
"size": 20,
"query": {
"bool": {
"must": [{
"terms": {
"category": ["cat1", "cat2"]
},
"terms": {
"category": ["cat3"]
}
}]
}
}
}
在上面的查询中(使用" bool""必须"形式)这是否说文档必须在"类别&#34中有cat1和cat2或cat3 ;属性?
注意:这与原始问题相比有很大改动。
答案 0 :(得分:0)
您使用bool查询将几种不同类型的查询组合在一起。只有当您想要添加其他查询(如过滤器)或必须不等等以及您的术语查询时,才会像使用它一样使用它。这仍然有效,但它将简单地重写为更简单的术语查询,这将花费更多的时间。
条款查询足以满足您的要求,它将返回包含类别中cat1或cat2的所有文档。
所以你的查询可能就像:
{
"constant_score" : {
"filter" : {
"terms" : { "categories" : ["cat1", "cat2"]}
}
}
}
如果要将其与其他查询结合使用,也可以在必须查询中使用相同的查询。
编辑:对于其他情况,即。并且您可以使用以下查询:
"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
更简单,并且不需要您知道您有多少条款。