可以动态使用elasticsearch同义词吗?

iq3niunx  于 2023-08-03  发布在  ElasticSearch
关注(0)|答案(2)|浏览(114)

我正在努力尝试在elasticsearch查询中实现同义词。正如我在Synonyms中看到的,我可以在创建索引时创建一个过滤器,结构如下:

"sinonimos": {
  "type": "synonym",
  "explicit": false,
  "synonyms_path": "sinonimos.txt"
}

字符串
这个过滤器正在分析器中使用,如果我理解正确的话,如果我的查询是“celular”,“sinonimos.txt”中的任何单词都将被认为是匹配的,我错了吗?
在elasticsearch/config文件夹中创建文件“sinonimos.txt”,其内容如下:

smartphone, telefone => celular


知道我在索引字段中有4个不同的值,称为“descricao”:

  • 细胞的
  • 智能手机
  • 电话
  • 手机

当我在sinonimos.txt文件中添加了一个新词“cellphone”,然后在索引中使用_reload_search_analyzers API,这个词是否也应该被查询?
这里的主要问题是,我如何以动态的方式实现这个同义词,所以当我向一个单词添加一个新的同义词,或者一个新的同义词列表时,我不必重新索引当前的索引?
在这个Elastic Blog里,他们说
同义词用在分析器中,可以在索引时或搜索时使用。
它们之间的区别很明显,在Elastic Blog中也说:
索引时间同义词有几个缺点:

  • 索引可能会变大,因为所有同义词都必须被索引。
  • 依赖于术语统计的搜索评分可能会受到影响,因为同义词也会被计算在内,并且不太常见的单词的统计数据会变得倾斜。
  • 如果不重新建立索引,则无法更改现有文档的同义词规则。

另一方面,在搜索时间分析器中使用同义词不会有很多上述问题:

  • 索引大小不受影响。
  • 语料库中的术语统计保持不变。
  • 同义词规则的更改不需要重新索引文档。

动态性的想法是,我将添加/删除新的单词/单词列表的所有时间,并希望这样做,在一个动态的方式,所以我不必重新索引或_关闭>更新> _打开索引。这可能吗?

mcvgt66p

mcvgt66p1#

Elasticsearch同义词token过滤器的一些有用信息

"filter": {
  "synonym": {
    "type": "synonym_graph",
    "synonyms_path": "analysis/synonym.txt",  
    "updateable": true                        
  }
}

字符串
要更新同义词列表,请更新synonym.txt文件并调用POST /index_name/_reload_search_analyzers并清除请求缓存POST /index_name/_cache/clear?request=true由于重新加载会影响到每个具有索引分片的节点,因此在使用此API之前,请务必更新集群中每个数据节点上的同义词文件,包括不包含分片副本的节点。这确保了同义词文件在集群中的任何地方都被更新,以防将来碎片被重新定位。https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-reload-analyzers.html#indices-reload-analyzers-api-desc

curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "my_synonyms": {
            "tokenizer": "whitespace",
            "filter": [ "synonym" ]
          }
        },
        "filter": {
          "synonym": {
            "type": "synonym_graph",
            "synonyms_path": "analysis/synonym.txt",  
            "updateable": true                        
          }
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "analyzer": "standard",
        "search_analyzer": "my_synonyms"              
      }
    }
  }
}
'


建议:设置profile:true并检查结果。您将看到search_analyzer的匹配字段。

GET test_synonym/_search
{
  "profile": true,
  "query": {
    "match": {
      "text": {
        "query": "test search",
        "analyzer": "my_synonyms"
      }
    }
  }
}

mwyxok5s

mwyxok5s2#

当你使用updatable true时,你将能够在不关闭索引的情况下执行reload the analyzer
文件:
您可以使用reload search analyzers API来获取对搜索分析器的synonym_graph或synonym标记过滤器中使用的同义词文件的更改。要符合条件,令牌筛选器必须具有true的可更新标志,并且只能在搜索分析器中使用。

相关问题