我在尝试正确组合弹性搜索查询时遇到问题,在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经验的人能帮上忙。
答案 0 :(得分:0)
将您的所有查询包装到should
查询的bool
子句中,然后将其放入另一个顶级filter
查询的bool
子句中。
伪代码(当我在手机上键入时):
“bool”: {
“filter”: {
“bool”: {
“should”: [
{query1},
{query2},
{query3}
]
}
}
}
在仅由bool
条组成的should
-查询中,将要求should
条中至少一个查询必须匹配({ {1}}-在这种情况下。
使用实际查询进行更新(其他说明):
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
查询的filer
子句中,以遵循最佳实践并保证更好的性能:每当您不关心分数时,尤其是当它始终与精确匹配查询有关时,都应将其放入bool
子句中。对于这些查询,Elasticsearch将不计算分数,因此甚至可以潜在地缓存该查询的结果,从而获得更好的性能。
答案 1 :(得分:0)
您可以使用should
(逻辑OR)和must
(逻辑AND)子句来使用Bool query。
下面是子句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
类型。