同义词图标记过滤器编辑

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

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

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

定义同义词集编辑

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

您可以使用两种格式来定义同义词规则: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(默认为 false)。如果为 true,则在解析同义词配置时忽略异常。重要的是要注意,只有那些无法解析的同义词规则才会被忽略。例如,考虑以下请求
response = client.indices.create(
  index: 'test_index',
  body: {
    settings: {
      index: {
        analysis: {
          analyzer: {
            synonym: {
              tokenizer: 'standard',
              filter: [
                'my_stop',
                'synonym_graph'
              ]
            }
          },
          filter: {
            my_stop: {
              type: 'stop',
              stopwords: [
                'bar'
              ]
            },
            synonym_graph: {
              type: 'synonym_graph',
              lenient: true,
              synonyms: [
                'foo, bar => baz'
              ]
            }
          }
        }
      }
    }
  }
)
puts response
PUT /test_index
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "synonym": {
            "tokenizer": "standard",
            "filter": [ "my_stop", "synonym_graph" ]
          }
        },
        "filter": {
          "my_stop": {
            "type": "stop",
            "stopwords": [ "bar" ]
          },
          "synonym_graph": {
            "type": "synonym_graph",
            "lenient": true,
            "synonyms": [ "foo, bar => baz" ]
          }
        }
      }
    }
  }
}

对于上述请求,单词 bar 被跳过,但映射 foo => baz 仍然被添加。但是,如果要添加的映射是 foo, baz => bar,则不会向同义词列表添加任何内容。这是因为映射的目标词本身被消除了,因为它是一个停用词。类似地,如果映射是“bar, foo, baz”并且 expand 设置为 false,则不会添加任何映射,因为当 expand=false 时,目标映射是第一个词。但是,如果 expand=true,则添加的映射将等效于 foo, baz => foo, baz,即除停用词之外的所有映射。

tokenizerignore_case 已弃用编辑

tokenizer 参数控制将用于对同义词进行标记化的标记器,此参数是为了向后兼容在 6.0 之前创建的索引。ignore_case 参数仅与 tokenizer 参数一起使用。

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

要应用同义词,您需要在分析器中包含一个同义词图标记过滤器

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

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

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

同义词规则不应包含在链中稍后出现的过滤器(如 stop 过滤器)删除的词。从同义词规则中删除一个词意味着在查询时不会匹配它。

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

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