在Elasticsearch中,如何搜索任意子字符串,可能包括空格? (搜索单词的一部分还不够;我想搜索整个字段的任何子字符串。)
我想它必须位于keyword
字段中,而不是text
字段。
假设我的Elasticsearch索引中只有几千个文档,我尝试:
"query": {
"wildcard" : { "description" : "*plan*" }
}
按预期工作 - 我得到描述中“计划”的每个项目,甚至像“取代”那样。
现在,我想做
"query": {
"wildcard" : { "description" : "*plan is*" }
}
...所以我可能会将文件与“Kaplan is not”等许多其他可能性相匹配。
对于我可能看到的通配符,匹配前缀或任何其他查询类型,这似乎是不可能的。如何只搜索任何子字符串? (在SQL中,我只会做description LIKE '%plan is%'
)
(我知道任何这样的查询对于大型数据集来说都会很慢或甚至不可能。)
答案 0 :(得分:1)
您是否尝试过elasticsearch中的 regxp query ?这肯定听起来像你可能感兴趣的东西。
答案 1 :(得分:1)
我希望这个Elasticsearch可能内置一些内容,因为这个简单的子字符串搜索看起来像一个非常基本的功能(想一想,它在C中实现为strstr()
,{{1}在SQL中,在大多数文本编辑器中为Ctrl + F,在C#中为LIKE '%%'
等,但似乎并非如此。请注意,regexp查询不支持不区分大小写,因此我还需要将其与此自定义分析器配对,以便索引匹配全小写。然后我也可以将搜索字符串转换为小写字母。
String.IndexOf
示例查询:
{
"settings": {
"analysis": {
"analyzer": {
"lowercase_keyword": {
"type": "custom",
"tokenizer": "keyword",
"filter": [ "lowercase" ]
}
}
}
},
"mappings": {
...
"description": {"type": "text", "analyzer": "lowercase_keyword"},
}
}
感谢Jai Sharma领导我;我只想提供更多细节。