我是elasticsearch的新手。有没有办法编写匹配并列出所有匹配某些可用字段(包括常见字段)的文档的查询?
我试着用一个例子来说明这一点。
我有一个系统,根据一些标准,我们提出建议。像一个图表。例如。从产品,osname,架构(机器),发布,版本和&等等。我想首先将product
和osname
与所有搜索相匹配。如果架构是x86
,如果为true,则稍后搜索,然后将此文档添加到结果&然后,如果版本是Service Pack 1
,则再次将其添加到结果中。最后,结果应包含3
和& 4
docs两者都有公共字段product和osname,其中一个查询匹配短语" Service Pack 1"和其他比赛" x86"
如果查询满足条件,则以下是我的2条建议。 doc下面有产品& osname为常用字段。
PUT /support/recommendation/3
{
"recommendation":"Suggested architecture 64 Bit",
"type":"warning",
"criteria": {
"product": ["tar","zip"],
"osname": "windows",
"machine": "x86"
}
}
PUT /support/recommendation/4
{
"recommendation":"Service Pack 2 or more is needed",
"type":"error",
"criteria": {
"product": ["tar","zip"],
"osname": "windows",
"release": "Service Pack 1"
}
}
我的查询
GET /support/recommendation/_search
{ /*search tar, windows, 32bit(x86) & SP1*/
"query": {
"filtered" : {
"query": {
"bool" : {
"must": [
{"match": {
"product": "tar"
}
},
{"match": {
"osname": "Windows"
}
}
],
"must": [
{"match_phrase": {
"release": "Service Pack 1"
}}
],
"should": [
{"match": {
"machine": "x86"
}
}
]
}
}
}
}
}
有没有办法实现这个目标?
答案 0 :(得分:1)
如果你想要你的文档与他们匹配EITHER机器:x86 OR release:Service Pack 1,那么只需使用包含两者的should子句。
GET /support/recommendation/_search { /*search tar, windows, 32bit(x86) & SP1*/
"query": {
"filtered" : {
"query": {
"bool" : {
"must": [
{"match": {
"product": "tar"
}
},
{"match": {
"osname": "Windows"
}
}
],
"should": [
{"match": {
"machine": "x86"
}
},
{"match_phrase": {
"release": "Service Pack 1"
}
}
],
"minimum_should_match" : 1
}
}
}
} }
更新:添加了minimum_should_match
子句