【问题标题】:Elasticsearch match on contained phrase with whitespaceElasticsearch 匹配包含空格的短语
【发布时间】:2018-09-14 08:48:42
【问题描述】:
如果包含关键短语,我需要搜索应该有搜索匹配的地方,但关键短语可以有空格,并且整个短语必须在那里。
按照我的理解,index_analyzer 和 searh_analyzer 都可以在空格上分割,也可以不分割,提供四种可能性 - 似乎没有一种能满足我的需要。
例如,假设关键短语是“one to”。这意味着我希望搜索“一二”或“一二三”来匹配,但不匹配“一”。考虑不同的选项:
- 对索引和搜索进行拆分 -> 不起作用,因为“one”会匹配
- 在索引上拆分但在搜索上不拆分 -> 不起作用,因为“一二”不匹配
- 不要在索引上拆分,在搜索上拆分 -> 不起作用,因为“一二”不匹配
- 不要在索引和搜索上拆分 -> 不起作用,因为“一二三”不匹配
【问题讨论】:
标签:
elasticsearch
search
tokenize
【解决方案1】:
一种可能的解决方案可能是为该字段创建新的mapping,类型为keyword,然后ElasticSearch 不会对其进行分析,并将“按原样”存储(实际上您可以对其运行规范化程序如果您需要以某种方式处理/更改它)。那么你就不需要和分析器打交道了。
假设您有名称为 description 的字段,那么映射可能如下所示:
{
...
"description": {
"type": "text", // assuming you originally have it as text
"fields": {
"original": "keyword",
"ignore_above": 512 // You can skip or change it and ES applies default value.
}
}
上面的代码意味着ElasticSearch 将保留两个版本的消息 - 默认已分析和未分析的新版本。然后您可以使用以下名称访问它:description.original 并使用例如通配符搜索。