我正在努力尝试在弹性搜索查询中实现同义词。 正如我在 Synonyms 中看到的,我可以在创建具有以下结构的索引时创建一个过滤器:
"sinonimos": {
"type": "synonym",
"explicit": false,
"synonyms_path": "sinonimos.txt"
}
此过滤器正在分析器中使用,如果我理解正确,如果我的查询是“cellular”,“sinonimos.txt”中的任何单词都将被视为匹配,我错了吗?
在elasticsearch/config文件夹中创建文件“sinonimos.txt”,其内容如下:
smartphone, telefone => celular
知道我的索引字段中有 4 个不同的值,称为“descricao”:
当我用新词“cellphone”修改“sinonimos.txt”文件,然后在索引中使用
_reload_search_analyzers
API时,是否也应该查询该词?
这里的主要问题是,我如何以动态的方式实现这个同义词,因此当我向单词或新的同义词列表添加新同义词时,我不必重新索引当前索引?
在这个Elastic Blog中,他们说
分析器中使用的同义词可以在索引时或搜索时使用。
它们之间的区别很明显,也在Elastic Blog中说过:
索引时间同义词有几个缺点:
另一方面,在搜索时间分析器中使用同义词不会出现上述许多问题:
动态性的想法是,我将一直添加/删除新单词/单词列表,并且希望以动态方式执行此操作,这样我就不必重新索引或 _close > update > _open 索引。这可能吗?
编辑: 问题是我试图使用同义词分析器作为索引分析器,而不是使用它作为 search_analyzer。
"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"
}
}
}
}
当您使用 updatable true 时,您将能够 重新加载分析器,而无需关闭索引。
医生:
您可以使用重新加载搜索分析器 API 来获取对 synonym_graph 或同义词标记过滤器中使用的同义词文件 搜索分析器。要符合资格,令牌过滤器必须具有 可更新标志为 true,仅用于搜索分析器。