如何在 ElasticSearch 中组合多个查询
How To Combine Multiple Queries In ElasticSearch
我在尝试正确组合弹性搜索查询时遇到问题,在 SQL 中,我的查询看起来像这样:
Select * from ABPs where (PId = 10 and PUId = 1130) or (PId = 30 and PUId = 2000) or (PlayerID = '12345')
我可以自己实现每一个并得到正确的结果。
查询 A)(PId = 10 和 PUId = 1130)
翻译成
{
"query": {
"bool": {
"must": [
{
"term": {
"PId": "1366"
}
},
{
"term": {
"PUId": "10"
}
}
]
}
}
}
查询 B)(PId = 10 和 PUId = 1130)
翻译与上面相同,只是值不同
查询 C) (PlayerID = '12345')
翻译成
{
"query": {
"match": {
"PlayerUuid": "62fe0832-7881-477c-88bb-9cbccdbfb3c3"
}
}
}
我一直在试图弄清楚如何将所有这些都放入同一个 ES 搜索查询中,但我一点运气都没有,希望具有更丰富 ES 经验的人能够给我一个手.
将所有查询包装到 bool
查询的 should
子句中,您将其放入另一个顶级 bool
的 filter
子句中查询。
伪代码(当我在单元格 phone 上打字时):
“bool”: {
“filter”: {
“bool”: {
“should”: [
{query1},
{query2},
{query3}
]
}
}
}
在仅由 should
-子句组成的 bool
- 查询中,将要求 should
-子句中的至少一个查询必须匹配(minimum_should_match
-会出现这种情况)
更新实际查询(补充说明):
POST <your_index_name>/_search
{
"query": {
"bool": {
"filter": {
"bool": {
"should": [
{"bool": {{"must": [ {"term": {"PId": "10"}},{"term": {"PUId": "1130"}} ]}}},
{"bool": {{"must": [ {"term": {"PId": "30"}},{"term": {"PUId": "2000"}} ]}}},
{"term": {"PlayerId": "12345"}}
]
}
}
}
}
}
上面的示例将您的实际 bool
-查询包装在另一个顶级 bool
-查询的 filer
-子句中,以遵循最佳实践并保证更好性能:当你不关心分数时,尤其是当它总是关于精确匹配查询时,你应该把它们放在 filter
子句中。对于这些查询,Elasticsearch 不会 计算分数,因此甚至可以缓存该查询的结果以获得更好的性能。
您可以使用 Bool query 使用 should
(逻辑或)和 must
(逻辑与)子句。
下面是子句Select * from ABPs where (PId = 10 and PUId = 1130) or (PId = 30 and PUId = 2000) or (PlayerID = '12345')
的ES查询表示
POST <your_index_name>/_search
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"term": {
"PId": "10"
}
},
{
"term": {
"PUId": {
"value": "1130"
}
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"PId": "30"
}
},
{
"term": {
"PUId": "2000"
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"PlayerId": "12345"
}
}
]
}
}
]
}
}
}
请注意,我假设字段 PId、PUId 和 PlayerId 都是 keyword
类型。
我在尝试正确组合弹性搜索查询时遇到问题,在 SQL 中,我的查询看起来像这样:
Select * from ABPs where (PId = 10 and PUId = 1130) or (PId = 30 and PUId = 2000) or (PlayerID = '12345')
我可以自己实现每一个并得到正确的结果。
查询 A)(PId = 10 和 PUId = 1130) 翻译成
{
"query": {
"bool": {
"must": [
{
"term": {
"PId": "1366"
}
},
{
"term": {
"PUId": "10"
}
}
]
}
}
}
查询 B)(PId = 10 和 PUId = 1130) 翻译与上面相同,只是值不同
查询 C) (PlayerID = '12345') 翻译成
{
"query": {
"match": {
"PlayerUuid": "62fe0832-7881-477c-88bb-9cbccdbfb3c3"
}
}
}
我一直在试图弄清楚如何将所有这些都放入同一个 ES 搜索查询中,但我一点运气都没有,希望具有更丰富 ES 经验的人能够给我一个手.
将所有查询包装到 bool
查询的 should
子句中,您将其放入另一个顶级 bool
的 filter
子句中查询。
伪代码(当我在单元格 phone 上打字时):
“bool”: {
“filter”: {
“bool”: {
“should”: [
{query1},
{query2},
{query3}
]
}
}
}
在仅由 should
-子句组成的 bool
- 查询中,将要求 should
-子句中的至少一个查询必须匹配(minimum_should_match
-会出现这种情况)
更新实际查询(补充说明):
POST <your_index_name>/_search
{
"query": {
"bool": {
"filter": {
"bool": {
"should": [
{"bool": {{"must": [ {"term": {"PId": "10"}},{"term": {"PUId": "1130"}} ]}}},
{"bool": {{"must": [ {"term": {"PId": "30"}},{"term": {"PUId": "2000"}} ]}}},
{"term": {"PlayerId": "12345"}}
]
}
}
}
}
}
上面的示例将您的实际 bool
-查询包装在另一个顶级 bool
-查询的 filer
-子句中,以遵循最佳实践并保证更好性能:当你不关心分数时,尤其是当它总是关于精确匹配查询时,你应该把它们放在 filter
子句中。对于这些查询,Elasticsearch 不会 计算分数,因此甚至可以缓存该查询的结果以获得更好的性能。
您可以使用 Bool query 使用 should
(逻辑或)和 must
(逻辑与)子句。
下面是子句Select * from ABPs where (PId = 10 and PUId = 1130) or (PId = 30 and PUId = 2000) or (PlayerID = '12345')
POST <your_index_name>/_search
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"term": {
"PId": "10"
}
},
{
"term": {
"PUId": {
"value": "1130"
}
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"PId": "30"
}
},
{
"term": {
"PUId": "2000"
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"PlayerId": "12345"
}
}
]
}
}
]
}
}
}
请注意,我假设字段 PId、PUId 和 PlayerId 都是 keyword
类型。