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