Elasticsearch 过滤器 - AND/OR 行为
Elasticsearch Filter - AND/OR behaviour
我有这个查询,我在其中搜索匹配 type: location
的所有文档,然后使用 postalCode
和 countryCode
上的完全匹配但前缀对结果应用过滤器address
.
过滤器工作正常并且表现为 AND
条件,即所有 3 个匹配项。如何在过滤器中实现 OR
条件?使用 OR
条件 - 即使一个过滤器匹配,它也应该 return 结果。
Elasticsearch 版本 - 7.9
GET index/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"type": "location"
}
}
],
"filter": [
{
"term": {
"postalCode": "12345"
}
},
{
"prefix": {
"address": "555"
}
},
{
"term": {
"countryCode": "US"
}
}
]
}
}
}
您可以在 filter
子句中使用 bool should
子句的组合。
添加具有索引数据、搜索查询和搜索结果的工作示例
索引数据:
{
"postalCode": "12345",
"address": "555",
"countryCode": "US",
"type":"location"
}
{
"postalCode": "9",
"address": "555",
"countryCode": "US",
"type":"location"
}
{
"postalCode": "9",
"address": "4",
"countryCode": "US",
"type":"location"
}
{
"postalCode": "9",
"address": "4",
"countryCode": "AK",
"type":"location"
}
搜索查询:
{
"query": {
"bool": {
"must": [
{
"match": {
"type": "location"
}
}
],
"filter": [
{
"bool": {
"should": [
{
"term": {
"postalCode": "12345"
}
},
{
"prefix": {
"address": "555"
}
},
{
"term": {
"countryCode.keyword": "US"
}
}
],
"minimum_should_match":1
}
}
]
}
}
}
搜索结果:
"hits": [
{
"_index": "65192559",
"_type": "_doc",
"_id": "2",
"_score": 0.10536051,
"_source": {
"postalCode": "9",
"address": "555",
"countryCode": "US",
"type": "location"
}
},
{
"_index": "65192559",
"_type": "_doc",
"_id": "1",
"_score": 0.10536051,
"_source": {
"postalCode": "12345",
"address": "555",
"countryCode": "US",
"type": "location"
}
},
{
"_index": "65192559",
"_type": "_doc",
"_id": "3",
"_score": 0.10536051,
"_source": {
"postalCode": "9",
"address": "4",
"countryCode": "US",
"type": "location"
}
}
]
我有这个查询,我在其中搜索匹配 type: location
的所有文档,然后使用 postalCode
和 countryCode
上的完全匹配但前缀对结果应用过滤器address
.
过滤器工作正常并且表现为 AND
条件,即所有 3 个匹配项。如何在过滤器中实现 OR
条件?使用 OR
条件 - 即使一个过滤器匹配,它也应该 return 结果。
Elasticsearch 版本 - 7.9
GET index/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"type": "location"
}
}
],
"filter": [
{
"term": {
"postalCode": "12345"
}
},
{
"prefix": {
"address": "555"
}
},
{
"term": {
"countryCode": "US"
}
}
]
}
}
}
您可以在 filter
子句中使用 bool should
子句的组合。
添加具有索引数据、搜索查询和搜索结果的工作示例
索引数据:
{
"postalCode": "12345",
"address": "555",
"countryCode": "US",
"type":"location"
}
{
"postalCode": "9",
"address": "555",
"countryCode": "US",
"type":"location"
}
{
"postalCode": "9",
"address": "4",
"countryCode": "US",
"type":"location"
}
{
"postalCode": "9",
"address": "4",
"countryCode": "AK",
"type":"location"
}
搜索查询:
{
"query": {
"bool": {
"must": [
{
"match": {
"type": "location"
}
}
],
"filter": [
{
"bool": {
"should": [
{
"term": {
"postalCode": "12345"
}
},
{
"prefix": {
"address": "555"
}
},
{
"term": {
"countryCode.keyword": "US"
}
}
],
"minimum_should_match":1
}
}
]
}
}
}
搜索结果:
"hits": [
{
"_index": "65192559",
"_type": "_doc",
"_id": "2",
"_score": 0.10536051,
"_source": {
"postalCode": "9",
"address": "555",
"countryCode": "US",
"type": "location"
}
},
{
"_index": "65192559",
"_type": "_doc",
"_id": "1",
"_score": 0.10536051,
"_source": {
"postalCode": "12345",
"address": "555",
"countryCode": "US",
"type": "location"
}
},
{
"_index": "65192559",
"_type": "_doc",
"_id": "3",
"_score": 0.10536051,
"_source": {
"postalCode": "9",
"address": "4",
"countryCode": "US",
"type": "location"
}
}
]