如何在Elasticsearch中创建涉及已分析和未分析字段的嵌套AND + OR查询?

时间:2017-03-17 09:55:20

标签: elasticsearch

我们说我有三个字段,A,B和C.C是一个存储电子邮件的分析字段,我需要一个完整的匹配。

在SQL术语中,我需要编写一个像

这样的查询
select * from table where A = '123' OR (B = '456' AND A = '' ) OR ( C = 'abc@xyz.com' AND A = '' AND B = '');

我在第一次尝试时写了下面的查询,但是我得到了一个Parse异常错误。

No filter registered for [match]];

一旦我用匹配查询删除块,我就开始得到结果,这让我觉得我不能用这种方式编写查询。

如果您有任何建议,请告诉我。

{   "size": 25,   "query": {
    "filtered": {
        "filter":{
            "or":[
                {"term": {"A":  "123"}},
                {
                    "and":[
                        {"term": {"B":  "456"}},
                        {"term": {"A":  ""}}
                    ]
                },
                {
                    "and":[
                        {
                            "match":{
                                "C":{
                                    "query": "abc@xyz.com",
                                    "operator": "AND"
                                }
                            }
                        },
                        {"term": {"A":  ""}},
                        {"term": {"B":  ""}}
                    ]   
                }
            ]
        }
    }   } }

1 个答案:

答案 0 :(得分:1)

你可以阅读这个https://www.elastic.co/guide/en/elasticsearch/guide/current/combining-filters.html 它应该对你有帮助。

SQL查询:

SELECT document
FROM   products
WHERE  productID = "KDKE-B-9947-#kL5"
OR (productID = "JODL-X-1937-#pV7" AND price = 30 )

ES查询:

{
  "query" : {
  "constant_score" : {
     "filter" : {
        "bool" : {
          "should" : [
            { "term" : {"productID" : "KDKE-B-9947-#kL5"}}, 
            { "bool" : { 
              "must" : [
                { "term" : {"productID" : "JODL-X-1937-#pV7"}}, 
                { "term" : {"price" : 30}} 
              ]
            }
           }
          ]
       }
     }
   }
 }
}