Elasticsearch 匹配包含空格的短语
Elasticsearch match on contained phrase with whitespace
我需要一个搜索,如果包含关键短语,则应该有搜索匹配项,但关键短语可以有空格,并且必须包含整个短语。
按照我的理解,index_analyzer
和 searh_analyzer
都可以按空格拆分,也可以不拆分,给出四种可能性 - none 似乎可以满足我的需要。
例如,假设关键字是 "one to"。这意味着我希望使用 "one two" 或 "one two three" 进行搜索以匹配但不使用 "one"。考虑不同的选择:
- 在索引和搜索上拆分 -> 不起作用,因为 "one" 将匹配
- 按索引拆分但不按搜索拆分 -> 不起作用,因为 "one two" 不匹配
- 不按索引拆分,按搜索拆分 -> 不起作用,因为 "one two" 不匹配
- 不要在索引和搜索上拆分 -> 不起作用,因为 "one two three" 不匹配
一个可能的解决方案可能是创建新的 mapping for that field with type keyword,然后它不会被 ElasticSearch
分析并存储 "as is"(实际上你可以 运行如果你需要以某种方式 process/change 来反对它)。那么你就不需要和分析器打交道了。
假设您有名称为 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
并使用例如通配符搜索。
我需要一个搜索,如果包含关键短语,则应该有搜索匹配项,但关键短语可以有空格,并且必须包含整个短语。
按照我的理解,index_analyzer
和 searh_analyzer
都可以按空格拆分,也可以不拆分,给出四种可能性 - none 似乎可以满足我的需要。
例如,假设关键字是 "one to"。这意味着我希望使用 "one two" 或 "one two three" 进行搜索以匹配但不使用 "one"。考虑不同的选择:
- 在索引和搜索上拆分 -> 不起作用,因为 "one" 将匹配
- 按索引拆分但不按搜索拆分 -> 不起作用,因为 "one two" 不匹配
- 不按索引拆分,按搜索拆分 -> 不起作用,因为 "one two" 不匹配
- 不要在索引和搜索上拆分 -> 不起作用,因为 "one two three" 不匹配
一个可能的解决方案可能是创建新的 mapping for that field with type keyword,然后它不会被 ElasticSearch
分析并存储 "as is"(实际上你可以 运行如果你需要以某种方式 process/change 来反对它)。那么你就不需要和分析器打交道了。
假设您有名称为 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
并使用例如通配符搜索。