我们如何在弹性搜索中组合AND / OR查询。例如,以下是我们的文件
{"title": "MI2", "brand": "Xiomi","operatingSystem": "Android"},
{"title": "Nexus","brand": "Google","operatingSystem": "Android"},
{"title": "Samsung Note","brand": "Samsung","operatingSystem": "Android"},
{"title": "Samsung Galaxy","brand": "Samsung","operatingSystem": "Android"}
现在我们如何从三星或Xiomi查询Android手机。
(operatingSystem ==“Android”)AND(品牌==“三星”OR品牌==“Xiomi”)
答案 0 :(得分:1)
AND / OR Logic可以用作过滤器。
elasticsearch中的过滤器将在执行查询之前进行评估,因此如果您需要将此逻辑应用于同时包含字符串查询的调用,它仍然是高效且适用的。
由于您的OR代码正在评估相同属性,在本案例中,您可以在AND语句中使用条款过滤器。您的ES电话将如下所示:
{
"query": {
"filtered": {
"query": {
"query_string": {
"query": "your search string"
}
},
"filter": {
"and": [
{
"term": { "operatingSystem": "Android" }
},
{
"terms": { "brand": ["Samsung", "Xiomi"] }
}
]
}
}
}
}
您可能会看到条款here的文档。默认值为布尔值OR,返回与提供的任何值匹配的文档。
要扩展您的问题,如果您希望第二部分评估不同属性上的OR语句,例如使用标题和品牌的数据结构,它将如下所示:
{
"query": {
"filtered": {
"query": {
"query_string": {
"query": "your search string"
}
},
"filter": {
"and": [
{
"term": { "operatingSystem": "Android" }
},
{
"or": [
{
"term": { "brand": "Xiomi" }
},
{
"term": { "title": "Samsung Note" }
}
]
}
]
}
}
}
}
后者相当于:
( operatingSystem == "Android" ) AND ( title == "Samsung Note" OR brand == "Xiomi")