Elasticsearch 匹配包含空格的短语

Elasticsearch match on contained phrase with whitespace

我需要一个搜索,如果包含关键短语,则应该有搜索匹配项,但关键短语可以有空格,并且必须包含整个短语。

按照我的理解,index_analyzersearh_analyzer 都可以按空格拆分,也可以不拆分,给出四种可能性 - none 似乎可以满足我的需要。

例如,假设关键字是 "one to"。这意味着我希望使用 "one two" 或 "one two three" 进行搜索以匹配但不使用 "one"。考虑不同的选择:

  1. 在索引和搜索上拆分 -> 不起作用,因为 "one" 将匹配
  2. 按索引拆分但不按搜索拆分 -> 不起作用,因为 "one two" 不匹配
  3. 不按索引拆分,按搜索拆分 -> 不起作用,因为 "one two" 不匹配
  4. 不要在索引和搜索上拆分 -> 不起作用,因为 "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 并使用例如通配符搜索。