同义词图标记过滤器

编辑

synonym_graph 标记过滤器允许在分析过程中轻松处理同义词,包括多词同义词。

为了正确处理多词同义词,此标记过滤器在处理过程中创建一个图标记流。有关此主题及其各种复杂性的更多信息,请阅读Lucene 的 TokenStreams 实际上是图博文。

此标记过滤器设计为仅用作搜索分析器的一部分。如果要在索引期间应用同义词,请使用标准的同义词标记过滤器

定义同义词集

编辑

同义词集中的同义词使用同义词规则定义。每个同义词规则包含作为同义词的词。

您可以使用两种格式来定义同义词规则: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_graph",
      "synonyms_set": "my-synonym-set",
      "updateable": true
    }
  }

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

使用 synonyms_path 来提供同义词文件

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

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

使用 synonyms 来定义内联同义词

  "filter": {
    "synonyms_filter": {
      "type": "synonym_graph",
      "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_graph"]
        }
      }
标记过滤器排序
编辑

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

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 提供匹配项。