2017-01-01 108 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维基。