同义词标记过滤器

编辑

synonym 标记过滤器允许在分析过程中轻松处理同义词

定义同义词集合

编辑

同义词集合中的同义词使用同义词规则定义。每个同义词规则都包含同义词的词语。

您可以使用两种格式定义同义词规则:Solr 和 WordNet。

Solr 格式
编辑

此格式使用两种不同的定义

  • 等效同义词:定义等效的词语组。词语之间用逗号分隔。例如

    ipod, i-pod, i pod
    computer, pc, laptop
  • 显式同义词:将一组词语匹配到其他词语。规则定义左侧的词语会扩展为右侧描述的所有可能性。例如

    personal computer => pc
    sea biscuit, sea biscit => seabiscuit
WordNet 格式
编辑

WordNet 定义跨越多行的同义词集合。每行包含以下信息

  • 同义词集合数字标识符
  • 同义词在同义词集合中的序号
  • 同义词词语
  • 词语类型标识符:名词 (n)、动词 (v)、形容词 (a) 或副词 (b)。
  • 词语在同义词网络中的深度

以下示例定义了词语“come”、“advance”和“approach”的同义词集合

s(100000002,1,'come',v,1,0).
s(100000002,2,'advance',v,1,0).
s(100000002,3,'approach',v,1,0).""";

配置同义词集合

编辑

可以使用同义词 API同义词文件或直接在标记过滤器配置中内联配置同义词。有关每个选项的更多详细信息,请参阅存储您的同义词集合

使用 synonyms_set 配置选项来提供通过同义词管理 API 创建的同义词集合

  "filter": {
    "synonyms_filter": {
      "type": "synonym",
      "synonyms_set": "my-synonym-set",
      "updateable": true
    }
  }

同义词集合必须存在才能添加到索引。如果创建索引时引用了不存在的同义词集合,则索引将保持部分创建且无法操作的状态。从这种情况中恢复的唯一方法是确保同义词集合存在,然后删除并重新创建索引,或关闭并重新打开索引。

使用 synonyms_path 提供同义词文件

  "filter": {
    "synonyms_filter": {
      "type": "synonym",
      "synonyms_path": "analysis/synonym-set.txt"
    }
  }

以上配置了一个 synonym 过滤器,其路径为 analysis/synonym-set.txt(相对于 config 位置)。

使用 synonyms 定义内联同义词

  "filter": {
    "synonyms_filter": {
      "type": "synonym",
      "synonyms": ["pc => personal computer", "computer, pc, laptop"]
    }
  }

其他设置包括

  • updateable(默认为 false)。如果为 true,则允许重新加载搜索分析器以获取同义词文件的更改。仅用于搜索分析器。
  • expand(默认为 true)。扩展等效同义词规则的定义。请参阅扩展等效同义词
  • lenient(默认为 updateable 设置的值)。如果为 true,则在解析同义词规则时忽略错误。重要的是要注意,只有无法解析的那些同义词规则会被忽略。有关无效同义词规则的 lenient 行为示例,请参阅同义词和停止标记过滤器
expand 等效同义词规则
编辑

expand 参数控制是否扩展等效同义词规则。考虑一个像这样定义的同义词

foo, bar, baz

使用 expand: true,同义词规则将扩展为

foo => foo
foo => bar
foo => baz
bar => foo
bar => bar
bar => baz
baz => foo
baz => bar
baz => baz

expand 设置为 false 时,同义词规则不会扩展,并且第一个同义词被视为规范表示。该同义词将等效于

foo => foo
bar => foo
baz => foo

expand 参数不影响显式同义词规则,例如 foo, bar => baz

tokenizerignore_case 已弃用
编辑

tokenizer 参数控制用于标记同义词的标记器,此参数用于向后兼容 6.0 之前创建的索引。ignore_case 参数仅与 tokenizer 参数一起使用。

使用同义词标记过滤器配置分析器

编辑

要应用同义词,您需要将同义词标记过滤器包含到分析器中

      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["stemmer", "synonym"]
        }
      }
标记过滤器排序
编辑

标记过滤器的顺序很重要。文本将首先通过同义词过滤器之前的过滤器进行处理,然后再由同义词过滤器处理。

Elasticsearch 还将使用标记器链中同义词过滤器之前的标记过滤器来解析同义词文件或同义词集合中的条目。在上面的示例中,同义词标记过滤器放置在词干分析器之后。词干分析器也将应用于同义词条目。

由于同义词映射中的条目不能具有堆叠位置,因此某些标记过滤器可能会在此处导致问题。产生多个标记版本的标记过滤器可能会选择在解析同义词时要发出哪个版本的标记。例如,asciifolding 将仅生成标记的折叠版本。其他标记过滤器(如 multiplexerword_delimiter_graphngram)将引发错误。

如果需要构建包含多标记过滤器和同义词过滤器的分析器,请考虑使用多路复用器过滤器,其中多标记过滤器位于一个分支中,而同义词过滤器位于另一个分支中。

同义词和 stop 标记过滤器
编辑

同义词和停止标记过滤器以以下方式相互交互

停止标记过滤器同义词标记过滤器之前
编辑

停止词将从同义词规则定义中删除。这可能会导致同义词规则出现错误。

如果 lenient 设置为 false,则在应用分析器更改时,无效的同义词规则可能会导致错误。对于可重新加载的分析器,这会阻止重新加载和应用更改。您必须更正同义词规则中的错误并重新加载分析器。

lenient 设置为 false 时,具有无效同义词规则的索引无法重新打开,从而使其在以下情况下无法操作

  • 包含索引的节点启动
  • 索引从关闭状态打开
  • 发生节点重启(这将重新打开分配的节点分片)

对于显式同义词规则,例如 foo, bar => baz,其中停止过滤器删除 bar

  • 如果 lenient 设置为 false,则会引发错误,因为 bar 将从同义词规则的左侧删除。
  • 如果 lenient 设置为 true,则会添加规则 foo => baz,并且会忽略 bar => baz

如果停止过滤器改为删除 baz

  • 如果 lenient 设置为 false,则会引发错误,因为 baz 将从同义词规则的右侧删除。
  • 如果 lenient 设置为 true,则同义词将不起作用,因为目标词已删除。

对于等效同义词规则,例如 foo, bar, bazexpand: true,其中停止过滤器删除 `bar`

  • 如果 lenient 设置为 false,则会引发错误,因为 bar 将从同义词规则中删除。
  • 如果 lenient 设置为 true,则添加的同义词将等效于以下同义词规则,这些规则不包含已删除的词
foo => foo
foo => baz
baz => foo
baz => baz
停止标记过滤器同义词标记过滤器之后
编辑

停止过滤器将从生成的同义词扩展中删除词条。

例如,同义词规则(如 foo, bar => baz)和删除 baz 的停止过滤器将无法匹配 foobar,因为两者都会扩展为 baz,而 baz 会被停止过滤器删除。

如果停止过滤器改为删除 foo,那么搜索 foo 将会扩展为 baz,而 baz 不会被停止过滤器删除,因此可能会为 baz 提供匹配项。