我需要基于以下SQL语句的弹性搜索查询
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"
答案 0 :(得分: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"]
}
}
}
}
答案 1 :(得分:0)
添加jbasko给出的答案:在 elsaticsearch 中执行 LIKE 查询在很大程度上取决于您对文档字段的映射。例如,如果您想在elasticsearch中使用等效的LIKE '%test%'
,则需要使用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
中的字符串和其他字符串分隔为连续字符串,其中包含您在设置中定义的字符数。
即。一个带有
的ngrammin_gram : 1
max_gram : 3
字符串“abcd”。
你会得到一系列术语:'a','ab','abc','b','bc','bcd','c','cd','c'。 elasticsearch将使用此术语来使用带反向索引的匹配(或多匹配)查询来查找正确的文档。
如需进一步阅读,您可以在elasticsearch wiki中搜索:mapping,ngram tokenizer和termvectors。