2017-04-24 104 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过滤器。