17

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

4

4 回答 4

16

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

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

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

  • 评分,因为同义词有不同的文档频率,
  • 多令牌同义词,因为查询解析器在空格上拆分。

在http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory(在 Solr wiki 上,但也与 ElasticSearch 相关)上获得更多详细信息。

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

于 2011-09-01T16:51:07.420 回答
3

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

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

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

于 2015-12-10T19:54:51.417 回答
1

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

  • 您想要一个指向当前索引的别名
  • 将新的索引文件同步到您的服务器
  • 使用使用新索引的自定义分析器创建新索引
  • 将内容从当前索引重建到新索引
  • 将索引别名从当前索引重新指向新索引
于 2011-09-24T08:17:21.367 回答
0

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

POST /my-index/_reload_search_analyzers 

同义词图标记过滤器必须设置updatabletrue

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

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

  1. 很有可能你有太多的数据需要每晚左右重新索引。
  2. Elasticsearch不允许对索引分析器使用同义词图过滤器,只有已弃用的同义词过滤器不能正确处理多词同义词。
于 2021-11-15T20:34:16.417 回答