2015-09-25 46 views
0

我正在用elasticsearch過濾器掙扎。我有一個company_office型,看起來像這樣:Elasticsearch查詢幫助 - 多個嵌套與/或

{ 
    "company_office_id": 1, 
    "is_headquarters": true, 
    "company": { 
    "name": "Some Company Inc" 
    }, 
    "attribute_values": [ 
     { 
     "attribute_id": 1, 
     "attribute_value": "attribute 1 value", 
     }, 
     { 
     "attribute_id": 2, 
     "attribute_value": "ABC", 
     }, 
     { 
     "attribute_id": 3, 
     "attribute_value": "DEF", 
     }, 
     { 
     "attribute_id": 3, 
     "attribute_value": "HIJ", 
     } 
    ] 
} 

讓我們假設ATTRIBUTE_VALUE是not_analyzed - 這樣我就可以完全匹配就可以了。

現在我想過濾多個attribute_id和值字段的組合。事情是這樣的SQL:

SELECT * 
FROM CompanyOffice c 
JOIN Attributes a --omitting the ON here, just assume the join is valid 
WHERE 
c.is_headquarters = true AND 
(
    (a.attribute_id=2 AND a.attribute_value IN ('ABC')) OR 
    (a.attribute_id=3 AND a.attribute_value IN ('DEF','HIJ')) 
) 

所以我需要在特定字段+ ID /值的多種組合進行篩選。

這裏是我試過的查詢:

{ 
    "query" : { 
    "filtered" : { 
     "filter" : { 
     "bool" : { 
      "must" : [ 


      { "term": {"is_headquarters": true } }, 
      {"bool": { 
         "must":[ 
         {"term": {"attribute_values.attribute_id": 1}}, 
         {"bool": { "should": [{"term": {"attribute_values.attribute_value": "HIJ"}}]}} 
         ] 
        }}   
      ] 
     } 
     } 
    } 
    } 
} 

該查詢返回的結果,即使在company_office不具有1 /「HIJ」任何ID /值對。在這裏,我的想法是,因爲這個布爾濾波器坐在父must段裏面,那麼所有項目必須是真實的:

  {"bool": { 
         "must":[ 
         {"term": {"attribute_values.attribute_id": 1}}, 
         {"bool": { "should": [{"term": {"attribute_values.attribute_value": "HIJ"}}]}} 
         ] 
        }} 

爲什麼這個查詢返回的結果給出的問題的開始提供的數據樣本?有沒有不同的方式來編寫過濾器,並完成我想要做的事情?

非常感謝您的幫助!

回答

2

如果您想查詢更深入的對象,而他們的扁平化結構,需要設置

"type": "nested" 

"attribute_values"財產。

然後請參考如何編寫​​,並且您應該正確地檢索整個文檔。使用inner hits來檢索匹配的attribute_values

默認情況下,Elasticsearch在索引時不嵌套屬性。所有子字段被壓縮到單獨的子字段中,無法通過其實際結構查詢它們。您不會看到這種效果,因爲原始文檔已返回。

除此之外,您的查詢是有點關閉。在最後的"should"聲明中,您只有1個詞條過濾器,因此它實際上是"must"部分,但它們必須重寫爲嵌套格式。

+0

好棒。我再也不能再嘗試這幾天了,一旦我回來了,我會回來評論答案。謝謝您的幫助!! – MattW

+0

添加嵌套的映射結束了伎倆。再次感謝! – MattW