是否可以在索引中存储弹性搜索的同义词?或者是否可以从像 couchdb 这样的数据库中获取同义词列表?我想通过 REST-API 将同义词动态添加到 elasticsearch。
4 回答
使用同义词时有两种方法:
- 在索引时扩展它们,
- 在查询时扩展它们。
不建议在查询时扩展同义词,因为它会引发以下问题:
- 评分,因为同义词有不同的文档频率,
- 多令牌同义词,因为查询解析器在空格上拆分。
在http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory(在 Solr wiki 上,但也与 ElasticSearch 相关)上获得更多详细信息。
所以推荐的方法是在索引时扩展同义词。在您的情况下,如果同义词列表是动态管理的,这意味着您应该重新索引每个包含同义词列表已更新的术语的文档,以便在更新前和更新后分析的文档之间保持评分一致。我并不是说这是不可能的,但它需要一些工作,并且可能会在索引中出现高频率的同义词引起性能问题。
对于几年前在其他答案中提出的解决方案,现在几乎没有新的解决方案。作为插件实现的两种主要方法:
- file-watcher-synonym 过滤器是一个插件,它可以按照用户的定义,每隔给定的秒数定期重新加载同义词。
- refresh -token-plugin允许实时更新索引。然而,这个插件显然有一些问题,这是因为 elasticsearch 无法区分搜索时的分析器和索引时使用的分析器。
关于这个主题的很好的讨论可以在 elastisearch github 票务系统上找到:https ://github.com/brusic/refresh-token-filters
在 elasticsearch 中更新同义词列表并不太痛苦。它可以通过打开和关闭来完成您可以从任何地方驱动它,但需要一些您自己的基础设施。它会这样工作:
- 您想要一个指向当前索引的别名
- 将新的索引文件同步到您的服务器
- 使用使用新索引的自定义分析器创建新索引
- 将内容从当前索引重建到新索引
- 将索引别名从当前索引重新指向新索引
在 2021 年,只需在查询时使用特定的搜索分析器扩展同义词并使用Reload 分析器 API:
POST /my-index/_reload_search_analyzers
同义词图标记过滤器必须设置updatable
为true
:
"my-synonyms": {
"type": "synonym_graph",
"synonyms_path": "my-synonyms.txt",
"updateable": true
}
此外,无论如何,您可能应该在查询时扩展同义词。为什么?
- 很有可能你有太多的数据需要每晚左右重新索引。
- Elasticsearch不允许对索引分析器使用同义词图过滤器,只有已弃用的同义词过滤器不能正确处理多词同义词。