2015-12-21 218 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" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
}