2017-03-17 63 views
0

假設我有三個字段,A,B和C.C是一個存儲電子郵件的分析字段,我需要一個完整匹配。如何在Elasticsearch中創建嵌套的AND + OR查詢,涉及分析和未分析的字段?

在SQL方面,我需要編寫一個查詢一樣,

select * from table where A = '123' OR (B = '456' AND A = '') OR (C = '[email protected]' AND A = '' AND B = ''); 

我寫了下面的查詢,在我第一次嘗試,但我得到一個解析異常錯誤。

No filter registered for [match]]; 

當我刪除與匹配查詢塊,我開始取得成果,這使得我以爲我可以不寫查詢這個樣子。

如果您有任何建議,請告訴我。

{ "size": 25, "query": { 
    "filtered": { 
     "filter":{ 
      "or":[ 
       {"term": {"A": "123"}}, 
       { 
        "and":[ 
         {"term": {"B": "456"}}, 
         {"term": {"A": ""}} 
        ] 
       }, 
       { 
        "and":[ 
         { 
          "match":{ 
           "C":{ 
            "query": "[email protected]", 
            "operator": "AND" 
           } 
          } 
         }, 
         {"term": {"A": ""}}, 
         {"term": {"B": ""}} 
        ] 
       } 
      ] 
     } 
    } } } 
+0

的可能的複製[ElasticSearch:無過濾器\註冊[匹配\] \](http://stackoverflow.com/問題/ 21116803/elasticsearch-無過濾註冊換匹配) – user2441151

回答

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}} 
       ] 
      } 
      } 
      ] 
     } 
    } 
    } 
} 
} 
相關問題