我想创建一个ElasticSearch查询,在其过滤器中获取一个参数,有时这个参数是单个值,有时它是一个值列表,我知道当它是单个值时我应该使用“term”当它是一个列表时,我应该使用“术语”。但我想要一个可以处理这两件事的查询,我将它传递给一个值或一个列表,然后返回结果。 [所有查询],您对如何做到这一点有任何想法吗?
query for single value:
{'filter': {
'and': [
{'term': {'first': 1}},
{'term': {'second': 1}},
]
},
}
查询列表:
{'filter': {
'and': [
{'terms': {'first': [1,2,3]}},
{'terms': {'second': [1,2,3]}},
]
},
}
但我想要一个查询来处理它们。
答案 0 :(得分:1)
使用带有“should”键的布尔查询将导致返回与任一子句匹配的文档。
{
"filter": {
"bool": {
"should": [
{
"terms": {
"first": "[1, 2]"
}
},
{
"terms": {
"second": "[2, 3]"
}
}
]
}
}
}
答案 1 :(得分:0)
您可以使用术语查询来处理两者,因为您可以在其中包含一个包含单个值的列表。
例如:
{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"must" : [
{ "terms" : { "field1" : ["a"] } },
{ "terms" : { "field2" : ["b", "c"] } }
]
}
}
}
}
}
请注意,bool
不会扩展到任何列表中的各个值。我想通过扩展AND逻辑的唯一方法是为每个单独的值使用term query
。 (这可能看起来一开始会花费很多时间,但bool
会缓存过滤器,以便稍后标记为True
或False
。