我正在努力尝试在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中也说:
索引时间同义词有几个缺点:
- 索引可能会变大,因为所有同义词都必须被索引。
- 依赖于术语统计的搜索评分可能会受到影响,因为同义词也会被计算在内,并且不太常见的单词的统计数据会变得倾斜。
- 如果不重新建立索引,则无法更改现有文档的同义词规则。
另一方面,在搜索时间分析器中使用同义词不会有很多上述问题:
- 索引大小不受影响。
- 语料库中的术语统计保持不变。
- 同义词规则的更改不需要重新索引文档。
动态性的想法是,我将添加/删除新的单词/单词列表的所有时间,并希望这样做,在一个动态的方式,所以我不必重新索引或_关闭>更新> _打开索引。这可能吗?
2条答案
按热度按时间mcvgt66p1#
Elasticsearch同义词token过滤器的一些有用信息
字符串
要更新同义词列表,请更新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型
建议:设置
profile:true
并检查结果。您将看到search_analyzer的匹配字段。型
mwyxok5s2#
当你使用updatable true时,你将能够在不关闭索引的情况下执行reload the analyzer。
文件:
您可以使用reload search analyzers API来获取对搜索分析器的synonym_graph或synonym标记过滤器中使用的同义词文件的更改。要符合条件,令牌筛选器必须具有true的可更新标志,并且只能在搜索分析器中使用。