如何动态更改ElasticSearch的同义词

b5lpy0ml  于 7个月前  发布在  ElasticSearch
关注(0)|答案(6)|浏览(90)

我的同义词存储在数据库中,当同义词在数据库中发生变化时,我希望更新索引中可能因同义词变化而发生变化的任何值。
我能想到的有两个部分。第一,弄清楚哪些文档需要重新索引。第二,弄清楚如何告诉ElasticSearch同义词已经更改。我正在努力解决第二个问题-告诉ElasticSearch同义词已经更改。
一个类似的问题已经被问到了--见Change dynamically elasticsearch synonyms--但是从阅读那期的答案中,我还没能弄清楚我需要什么。
目前,我的配置文件看起来像下面这样:

index :
  analysis :
    analyzer :
      myanalyzer :
        filter: [standard, mysynonymfilter]
filter :
  mysynonymfilter :      
    type : synonym
    synonyms : synonyms.txt
    ignore_case : false
    expand : true
    format : solr

字符串
我的想法是这样做:

curl -XPUT 'http://127.0.0.1:9200/foo/_settings'  -d '
{
    "filter" : {
        "synonym" : {
            "type" : "mysynonymfilter",
            "synonyms" : [
                "cosmos, universe"
            ] 
        }
    }
}
'


但这似乎并没有做我想要的。也就是说,索引设置没有得到更新,因为我可以告诉。
我正在努力做的事情是可能的吗?如果是,你知道我做错了什么吗?
另外,我相当肯定我可以通过更新同义词文件(如果我必须使用文件的话)来实现这一点,但是这有点复杂,我想避免。
谢谢你的帮助,埃里克

dfddblmv

dfddblmv1#

事实证明,您可以通过编程方式告诉ElasticSearch同义词已经更改。也就是说,没有必要更新同义词文件。以下是必要的基本步骤:

  • 关闭索引。
  • 使用新的同义词列表更新索引设置。为了安全起见,我更新了索引的所有分析器,标记器和字符过滤器(不仅仅是同义词过滤器)-但我不确定这是必要的。
  • 打开索引。
b5buobof

b5buobof2#

我知道这是一个旧的线程,但截至ES 7.5,他们增加了一个新的功能,以更新同义词。看看他们的documentation
您需要发出一个POST API,如下所示POST /twitter/_reload_search_analyzers
这将重新加载所有搜索分析器,还确保同义词标记过滤器将updateable标志设置为true,如"updatedable": true
PS:这个功能是X-Pack的一部分,并且在基本许可证下是免费的。

a9wyjsp7

a9wyjsp73#

我知道这是一个古老的线程,但如果它帮助别人.答案可以在这里找到:
如果在stopwords参数中指定了内联的stopwords,则唯一的选择是关闭索引并使用更新索引设置API更新分析器配置,然后重新打开索引。
如果您在带有stopwords_path参数的文件中指定停止字,则更新停止字会更容易。您可以只更新文件(在集群中的每个节点上),然后通过以下任一操作强制重新创建分析器:
关闭并重新打开索引(请参阅打开/关闭索引),或逐个重新启动群集中的每个节点

von4xj4u

von4xj4u4#

有一个重新加载同义词文件lindstromhenrik/elasticsearch-analysis-file-watcher-synonym的项目虽然我不知道它是否适用于最新版本。也许你可以通过使用插件和扩展同义词在查询时开始,因为在查询时,你会有所有的同义词更新,而不是重新索引文档,你猜应该更新,因为在同义词文件的变化。

lymnna71

lymnna715#

在最后一个curl命令中,您已经翻转了mysynonymfiltersynonym。类型应该是synonym

ohtdti5x

ohtdti5x6#

在2023年使用7.16.3版本并将*.txt同义词文件放在{ES_HOME}/config/analysis文件夹中;
下面是我用来创建模式的索引settings

PUT 'http://localhost:9200/indexName'

{
  "settings": {
    "index.number_of_replicas": 0,
    "index.max_ngram_diff": 15,
    "index.default_pipeline": "my_pipeline",
    "analysis": {
      "analyzer": {
        "autocomplete": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "autocomplete_filter"
          ]
        },
        "standardTokenizer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase"
          ]
        },
        "mySynonymAnalyzer":{
          "tokenizer":"standard",
          "filter":[  
            "mySynonymFilter",
            "lowercase"
          ]
        }
      },
      "filter": {
        "autocomplete_filter": {
          "type": "ngram",
          "min_gram": 2,
          "max_gram": 15
        },
        "mySynonymFilter":{
          "type":"synonym",
          "synonyms_path":"analysis/synonym.txt",
          "updateable": true
        }
      }
    }
  }
}

字符串
下面是我的mappings,用于定义synonym分析器在实际field中的用法。

PUT 'http://localhost:9200/offers/_mapping'

{
  "properties": {
    "myField": {
      "type": "text",
      "analyzer": "standardTokenizer",
      "search_analyzer": "mySynonymAnalyzer",
      "fields": {
        "keyword": {
          "type": "keyword"
        }
      }
    }
  }
}


这里需要注意的是,同义词分析器是可更新的,因此必须在search_analyzer阶段使用,而不是在索引阶段使用,否则会出错。
为了强制更新同义词列表,* 在elasticsearch的每个节点上更新synchron.txt文件,然后消耗以下2个API来更新同义词列表 *,这是同义词更新后的必经步骤。

POST 'http://localhost:9200/indexName/_reload_search_analyzers'
POST 'http://localhost:9200/indexName/_cache/clear?request=true'

相关问题