巢ElasticSearch:使用嵌套查询和嵌套布尔搜索对象
问题描述:
我使用谷弹性和使用头插件构建查询的布尔搜索,我结合多个查询巢ElasticSearch:使用嵌套查询和嵌套布尔搜索对象
有关DB结构和弹性映射
注意事项
- 数据库中的每个文件被链接到特定的简档,其 又具有多个属性
- 每个文档有多个属性v与此相关的线索
在此查询中,我试图获取具有特定配置文件和属性值> 30的所有文档,因为该属性应仅具有属性Id 2。
SQL查询:
选择AV *,从文件d d.name内连接上的AttributeValue AV d.DocumentId = av.DocumentId 其中d.profileid = 1和av.AttributeId = 2和av.Intvalue> 30
弹性查询
{ "query": {
"bool": {
"must": [
{
"term": { "Document.profileid": "1" }
}
,
{
"term": {"Document.lstChildren.AttributeID": "2" }
}
,
{
"range": { "Document.lstChildren.IntValue": { "gt": "30"} }
}
,
{
"match_all": { }
}
],
"must_not": [ ],
"should": [ ]
}
}, "from": 0, "size": 10, "sort": [ ], "facets": { }
}
问题
结果还包含具有以下属性的文档值
- 属性值= 3和属性Id = 2(值是< 30)
- 属性值= 34,但与属性Id大于2 (不正确的)不同
本文件不能包含因为它不能满足我的需求。
我该如何构建这个查询?
答
解决方法是首先通过使lstChildren成为嵌套对象来更改映射。然后使用嵌套查询将确保符合指定的所有条件。下面的嵌套查询指定两个条件仅返回预期的结果,但我用“平等”,而不是“大于”为“INTVALUE”为了保持它的简单:
{
"query": {
"nested": {
"path": "lstChildren",
"query": {
"bool": {
"must": [
{
"match": {
"lstChildren.AttributeID":"2"
}
},
{
"match": {
"lstChildren.IntValue": "31"
}
}
]
}
}
}
}
}
您可能感兴趣的样品文件和索引映射? – Rob
你可以尝试从你的'must'列表中删除''match_all“:{}'查询吗?这是完全没有必要的,如果因为它而出现一些错误,我不会感到惊讶。 – Sam
@Sam'match_all“:{}'没有解决问题 – Coding