2017-04-24 158 views
0

名單上我有值的元組的列表,像這樣:匹配字段值組合在elasticsearch

[("a1", "b1", "b1"), ("a2", "b2", "b3")... ("a_n", "b_n", "c_n")] 

這是一組值的字段「A」,「B」和「C 「我想用它來匹配elasticsearch中的文檔。我該如何做這種類型的多領域術語查詢,其中匹配必須按上面定義的集合發生?

編輯:

我嘗試使用布爾查詢,像這樣:

query={ 
    "query": { 
     "bool": { 
      "should": [{ 
        "bool": { 
         "must":[ 
          {"term": {"a": a_val}}, 
          {"term": {"b": b_val}}, 
          {"term": {"c": c_val}} 
         ] 
        } 
       } 
       for (a_val, b_val, c_val) in identifiers 
      ] 
     }, 
    }, 
} 

es.search('my_index', body=query) 

,但是這導致:

TransportError(400, 'search_phase_execution_exception', 'failed to create query:... 

我也嘗試了布爾查詢的簡化版本但得到了完全相同的錯誤:

query = { 
    "query": { 
     "bool": { 
      "must": [ 
       {"term": {"a": "a1"}}, 
       {"term": {"b": "b1"}}, 
       {"term": {"c": "c1"}}  
      ] 
     }, 
    }, 
} 

es.search('my_index', body=query) 

我在做這些布爾查詢錯誤?

+0

我認爲[bool query](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html#query-dsl-bool-query)是什麼你正在尋找。 – avr

+0

是的,隨着布爾查詢你也必須建模你的數據了一下。您可能需要嵌套的數據類型。看看嵌套的數據類型 – user3775217

回答

0

如果可能的話,您應該用a1-b1-c1等分隔符將它們索引到一個單獨的keyword字段中,然後使用帶有您要查找的值的數組的單個terms過濾器。