如何动态更改ElasticSearch的同义词

b5lpy0ml  于 2023-11-17  发布在  ElasticSearch
关注(0)|答案(6)|浏览(203)

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

  1. index :
  2. analysis :
  3. analyzer :
  4. myanalyzer :
  5. filter: [standard, mysynonymfilter]
  6. filter :
  7. mysynonymfilter :
  8. type : synonym
  9. synonyms : synonyms.txt
  10. ignore_case : false
  11. expand : true
  12. format : solr

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

  1. curl -XPUT 'http://127.0.0.1:9200/foo/_settings' -d '
  2. {
  3. "filter" : {
  4. "synonym" : {
  5. "type" : "mysynonymfilter",
  6. "synonyms" : [
  7. "cosmos, universe"
  8. ]
  9. }
  10. }
  11. }
  12. '


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

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

  1. PUT 'http://localhost:9200/indexName'
  2. {
  3. "settings": {
  4. "index.number_of_replicas": 0,
  5. "index.max_ngram_diff": 15,
  6. "index.default_pipeline": "my_pipeline",
  7. "analysis": {
  8. "analyzer": {
  9. "autocomplete": {
  10. "type": "custom",
  11. "tokenizer": "standard",
  12. "filter": [
  13. "lowercase",
  14. "autocomplete_filter"
  15. ]
  16. },
  17. "standardTokenizer": {
  18. "type": "custom",
  19. "tokenizer": "standard",
  20. "filter": [
  21. "lowercase"
  22. ]
  23. },
  24. "mySynonymAnalyzer":{
  25. "tokenizer":"standard",
  26. "filter":[
  27. "mySynonymFilter",
  28. "lowercase"
  29. ]
  30. }
  31. },
  32. "filter": {
  33. "autocomplete_filter": {
  34. "type": "ngram",
  35. "min_gram": 2,
  36. "max_gram": 15
  37. },
  38. "mySynonymFilter":{
  39. "type":"synonym",
  40. "synonyms_path":"analysis/synonym.txt",
  41. "updateable": true
  42. }
  43. }
  44. }
  45. }
  46. }

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

  1. PUT 'http://localhost:9200/offers/_mapping'
  2. {
  3. "properties": {
  4. "myField": {
  5. "type": "text",
  6. "analyzer": "standardTokenizer",
  7. "search_analyzer": "mySynonymAnalyzer",
  8. "fields": {
  9. "keyword": {
  10. "type": "keyword"
  11. }
  12. }
  13. }
  14. }
  15. }


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

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

展开查看全部

相关问题