我是ES查询的新手。我试图根据一个可以匹配任何值而不是一个特定值的键来获得结果。例如:键foo
可以是bar, baz
中的一个。我尝试使用数组,但最终会得到错误的结果或异常。 ES中OR案例的正确语法是什么。我使用的是ES 5.6。*
答案 0 :(得分:0)
有很多方法可以做到这一点。
根据您使用的分析仪,您可以这样做:
GET /test/_search
{
"query": {
"match": {
"foo": "bar, baz"
}
}
}
演示它分析的内容(默认情况下为5.6)
GET /test/_analyze
{
"field": "foo",
"text": [
"bar, baz"
]
}
输出这些代币:
{
"tokens": [
{
"token": "bar",
"start_offset": 0,
"end_offset": 3,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "baz",
"start_offset": 5,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 1
}
]
}
在上面的例子中,使用“bar,baz”或“bar baz”相当于搜索“bar”和“baz”。
你也可以在这样的查询中对它们进行分组:
GET /test/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"foo": "bar"
}
},
{
"match": {
"foo": "baz"
}
}
]
}
}
}
上面会给你一个得分的查询,要求查询文件中的bar和baz匹配。
您也可以将“must”替换为“filter”,“should”或“must_not”。 “过滤器”将被取消标记,应该将您从ANDing查询切换到ORing查询(并且您还可以指定OR的最小量),或者使用“must_not”
反转查询除此之外还有更多方法,但这应该让你开始走上正轨。
一个“应该”的例子,只需要命中两个术语中的一个,因为这是你原来的问题:
GET /test/_search
{
"query": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"match": {
"foo": "bar"
}
},
{
"match": {
"foo": "baz"
}
}
]
}
}
}
答案 1 :(得分:0)
您需要将bool
条件与should
和match
或match_phrase
结合使用(只要您确切知道要搜索的内容,就会喜欢match_phrase)
GET local-signaler/_search
{
"query": {
"bool" : {
"should" : [
{ "match_phrase" : { "foo" : "bar" } },
{ "match_phrase" : { "foo" : "baz" } }
],
"minimum_should_match" : 1
}
}
}