【问题标题】:Change dynamically elasticsearch synonyms动态更改弹性搜索同义词
【发布时间】:2011-11-08 11:58:05
【问题描述】:

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

【问题讨论】:

    标签: lucene elasticsearch


    【解决方案1】:

    使用同义词有两种方法:

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

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

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

    http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory(在 Solr wiki 上,但也与 ElasticSearch 相关)了解更多详情。

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

    【讨论】:

    • 谢谢,如果我可以将同义词列表中的更改带入索引,这是一个有用的提示。但是是否可以将同义词列表保存在数据库或 lucene 索引中?
    • 不仅仅通过配置,Elasticsearch 代码期望同义词映射来自其设置或文本文件。以下是触发同义词过滤器实例化的代码片段:github.com/elasticsearch/elasticsearch/blob/master/modules/…github.com/elasticsearch/elasticsearch/blob/master/modules/…
    • 您可以查看最近更新的弹性搜索synonym filter documentation。它包含文件和配置嵌套同义词的示例以及支持的同义词格式。
    • 这是一个非常有用的提示,我现在已改为仅在索引时基于同义词进行扩展。
    • 1.在查询时间和索引时间扩展之间进行选择并不那么明显,也没有正确或错误的答案。 2. 查询时间扩展对评分没有影响(相反,索引时间有(elastic.co/guide/en/elasticsearch/guide/current/…)。 3. 您可以在查询时使用多标记同义词,方法是降低查询效率并检查拆分前的同义词(您甚至可以在恒定时间进行)。
    【解决方案2】:

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

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

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

    【讨论】:

    • 对于任何阅读本文的人,现在有“托管”同义词过滤器,可通过 HTTP 查询同义词。如果在索引时添加同义词,则在更改同义词时仍需要重新索引。
    • 截至 2019 年 1 月 20 日,File-Watcher 插件已经非常过时,开发者已经很长时间处于非活动状态。
    【解决方案3】:

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

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

    【讨论】:

    • 这真的取决于你的索引的大小。
    【解决方案4】:

    在 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. 可能是您有太多数据需要每晚左右重新编制索引。
    2. Elasticsearch does not allow 用于索引分析器的同义词图过滤器,只有已弃用的同义词过滤器不能正确处理多词同义词。

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 1970-01-01
      • 2017-08-01
      • 2021-12-14
      • 2012-07-11
      • 2019-06-04
      • 1970-01-01
      • 2021-02-19
      • 2019-06-15
      相关资源
      最近更新 更多