动态更改elasticsearch同义词

问题描述 投票:0回答:4

是否可以在索引中存储elasticsearch的同义词?或者是否可以从像 couchdb 这样的数据库中获取同义词列表? 我想通过 REST-API 将同义词动态添加到 elasticsearch。

lucene elasticsearch
4个回答
16
投票

使用同义词有两种方法:

  • 在索引时扩展它们,
  • 在查询时扩展它们。

不建议在查询时扩展同义词,因为它会引发以下问题:

  • 评分,因为同义词有不同的文档频率,
  • 多标记同义词,因为查询解析器在空格上进行分割。

有关此内容的更多详细信息,请访问 http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory(在 Solr wiki 上,但也与 ElasticSearch 相关)。

因此推荐的方法是在索引时扩展同义词。在您的情况下,如果同义词列表是动态管理的,则意味着您应该重新索引包含同义词列表已更新的术语的每个文档,以便更新前后分析的文档之间的评分保持一致。我并不是说这是不可能的,但它需要一些工作,并且可能会引发索引中出现频率较高的同义词的性能问题。


3
投票

与几年前其他答案中提出的解决方案相比,现在几乎没有新的解决方案。作为插件实现的两种主要方法:

  1. file-watcher-synonym 过滤器是一个插件,可以按照用户定义,每隔给定的秒数定期重新加载同义词。
  2. refresh-token-plugin允许实时更新索引。然而,这个插件显然有一些问题,这是由于 Elasticsearch 无法区分搜索时的分析器和索引时使用的分析器。

有关此主题的良好讨论可以在 elastisearch github 票务系统上找到:https://github.com/brusic/refresh-token-filters


1
投票

在elasticsearch中更新同义词列表并不是太痛苦。它可以通过打开和关闭来完成您可以从任何地方驱动它,但需要一些您自己的基础设施。它会像这样工作:

  • 您想要一个指向当前索引的别名
  • 将新的索引文件同步到您的服务器
  • 使用使用新索引的自定义分析器创建新索引
  • 将当前索引的内容重建到新索引
  • 将索引别名从当前索引重新指向新索引

1
投票

在 2021 年,只需使用特定的搜索分析器在查询时扩展同义词并使用重新加载分析器 API:

POST /my-index/_reload_search_analyzers 

同义词图标记过滤器必须将

updatable
设置为
true
:

  "my-synonyms": {
    "type": "synonym_graph",
    "synonyms_path": "my-synonyms.txt",
    "updateable": true
  }

此外,无论如何,您应该在查询时扩展同义词。为什么?

  1. 您可能有太多数据需要每天晚上左右重新索引。
  2. Elasticsearch 不允许索引分析器使用同义词图表过滤器,仅允许使用已弃用的同义词过滤器,该过滤器无法正确处理多词同义词。

2024 年更新:

现在您还有两个选择:

  1. 最新的 Elasticsearch 版本有一个 Synonyms API
  2. Querqy可以使用“通用规则重写器”来配置同义词,并有一个API来更新重写器。
© www.soinside.com 2019 - 2024. All rights reserved.