2017-01-01 161 views
0

我需要根據下面的SQL語句彈性搜索查詢的WHERE子句

SELECT * FROM documents 
WHERE (doc_name like "%test%" OR doc_type like "%test%" OR doc_desc like "%test%) AND 
user_id = 1 AND doc_category = "Utilities" 

回答

1

這取決於你的映射,但你可以開始與像這樣的工作彈性搜索查詢:

"query": { 
    "filtered": { 
     "filter": { 
      "bool": { 
       "must": [ 
        { 
         "term": { 
          "user_id": 1 
         } 
        }, 
        { 
         "term": { 
          "doc_category": "Utilities" 
         } 
        } 
       ] 
      } 
     }, 
     "query": { 
      "multi_match": { 
       "query": "test", 
       "fields": ["doc_name", "doc_type", "doc_desc"] 
      } 
     } 
    } 
} 
+0

感謝分享。但是我沒有從中得到正確的結果。你能幫我解決如何添加LIKE條件。布爾查詢不能解決我的問題。 –

0

添加到由jbasko給出了答案:在elsaticsearch非常依賴於你的文檔字段映射做LIKE查詢。例如,如果你想要的LIKE '%test%'在elasticsearch相當於你需要使用NGRAM分詞吧:

{ 
"settings": { 
    "analysis": { 
     "analyzer": { 
     "some_analyzer_name": { 
      "tokenizer": "some_tokenizer_name" 
     } 
     }, 
     "tokenizer": { 
     "some_tokenizer_name": { 
      "type": "ngram", 
      "min_gram": <minimum number of characters>, 
      "max_gram": <maximum number of characters>, 
      "token_chars": [ 
      "letter", 
      "digit" 
      ] 
     } 
     } 
    } 

...

,並在田地裏的映射,使用分析:

"mapping":{ 
... 
"doc_type" : { 
"type" :"string", 
"analyzer" : "some_analyzer_name" 
}, 
... 
"doc_type" : { 
"type" :"string", 
"analyzer" : "some_analyzer_name" 
}, 
... 
} 

有關ngram的簡短說明,此標記器將字段doc_type中的字符串分隔爲具有您在set中定義的字符量的小連續字符串吊環。

即具有

min_gram : 1 
max_gram : 3 

在模式爲 「abcd」 一個的ngram。 'a','ab','abc','b','bc','bcd','c','cd','c'。這個術語將被elasticsearch用於使用具有反向索引的匹配(或多重匹配)查詢來找到正確的文檔。

如需進一步閱讀,你可以搜索:測繪,NGRAM分詞和termvectors在elasticsearch維基。