lucene 动态更改ElasticSearch同义词

ego6inou  于 2022-11-07  发布在  Lucene
关注(0)|答案(4)|浏览(214)

是否可以在索引中存储ElasticSearch的同义词?或者是否可以从数据库(如couchdb)中获取同义词列表?我想通过REST-API向ElasticSearch动态添加同义词。

nhhxz33t

nhhxz33t1#

使用同义词时有两种方法:

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

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

  • 评分,因为同义词具有不同的文档频率,
  • 多标记同义词,因为查询解析器按空格拆分。

更多细节请访问http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory(在Solr wiki上,但也与ElasticSearch相关)。
因此,推荐的方法是在索引时扩展同义词。在您的情况下,如果同义词列表是动态管理的,这意味着您应该重新索引每个包含同义词列表已更新的术语的文档,以便在更新前后分析的文档之间保持评分一致。我并不是说这是不可能的,但是这需要一些工作,并且可能会引起索引中出现频率很高的同义词的性能问题。

cgvd09ve

cgvd09ve2#

几年前在其他答案中提出的解决方案现在几乎没有什么新的解决方案。

  1. file-watcher-synonym filter是一个插件,可以定期重新加载同义词每给定的秒数,由用户定义。
  2. refresh-token-plugin允许索引的实时更新。然而,这个插件也有一些问题,这是因为elasticsearch无法区分只在搜索时使用的分析器和在索引时使用的分析器。
    关于这个主题的好的讨论可以在elastisearch github ticket系统上找到:https://github.com/brusic/refresh-token-filters
ippsafx7

ippsafx73#

在elasticsearch中更新同义词列表并不太麻烦,可以通过打开和关闭来完成。你可以从任何地方驱动它,但需要一些你自己的基础设施。它的工作方式如下:

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

dauxcl2d4#

在2021中,只需在查询时使用特定的search analyzer展开同义词,并使用Reload analyzer API

POST /my-index/_reload_search_analyzers

同义词图标记筛选器必须已将updatable设置为true

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

此外,无论如何,您都应该在查询时扩展同义词。为什么?
1.您可能有太多的数据需要每晚左右重新索引。

  1. Elasticsearch does not allow用于索引分析器的同义词图过滤器,仅限已弃用的同义词过滤器,该过滤器无法正确处理多词同义词。

相关问题