2015-12-21 220 views
0

我使用谷弹性和使用头插件构建查询的布尔搜索,我结合多个查询巢ElasticSearch:使用嵌套查询和嵌套布尔搜索对象

有关DB结构和弹性映射

注意事项
  1. 数据库中的每个文件被链接到特定的简档,其 又具有多个属性
  2. 每个文档有多个属性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": { } 
    } 

问题

结果还包含具有以下属性的文档值

  1. 属性值= 3和属性Id = 2(值是< 30)
  2. 属性值= 34,但与属性Id大于2 (不正确的)不同

本文件不能包含因为它不能满足我的需求。

我该如何构建这个查询?

+0

您可能感兴趣的样品文件和索引映射? – Rob

+1

你可以尝试从你的'must'列表中删除''match_all“:{}'查询吗?这是完全没有必要的,如果因为它而出现一些错误,我不会感到惊讶。 – Sam

+0

@Sam'match_all“:{}'没有解决问题 – Coding

回答

2

解决方法是首先通过使lstChildren成为嵌套对象来更改映射。然后使用嵌套查询将确保符合指定的所有条件。下面的嵌套查询指定两个条件仅返回预期的结果,但我用“平等”,而不是“大于”为“INTVALUE”为了保持它的简单:

{ 
    "query": { 
    "nested": { 
     "path": "lstChildren", 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "match": { 
       "lstChildren.AttributeID":"2" 
       } 
      }, 
      { 
       "match": { 
       "lstChildren.IntValue": "31" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
}