我正在尝试在我的搜索实现中实现同义词文件。我找到了许多文档作为实现指南,但最终无法找到可行的解决方案。
首先,我添加了分析器如下:
PUT /products/_settings
{
"settings": {
"index" : {
"analysis" : {
"analyzer" : {
"synonym" : {
"tokenizer" : "whitespace",
"filter" : ["synonym"]
}
},
"filter" : {
"synonym" : {
"type" : "synonym",
"synonyms_path" : "analysis/synonym.txt"
}
}
}
}
}
}
然后我尝试像下面这样使用这个同义词分析器:
GET products/_search
{
"query": {
"multi_match": {
"query": "television",
"fields": ["prd_name","brand_name", "prd_sdescription"],
"analyzer": "synonym"
}
}
}
我有 solr 格式的同义词,如:
GB,gib,gigabyte,gigabytes
MB,mib,megabyte,megabytes
Television, Televisions, TV, TVs
但是当我有电视的记录时,搜索对电视一无所获。
我还尝试使用同义词匹配搜索单个字段 (prd_name),因为我需要更改但在我想更改 prd_name 字段的映射时出现错误。
"type": "illegal_argument_exception",
"reason": "Mapper for [prd_name] conflicts with existing mapping in other types:\n[mapper [prd_name] has different [analyzer]]"
prd_name 的当前映射是:
"prd_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
如果有人能给我一步一步的解决方案,那对我来说会很棒。
Elasticsearch version: 6.4.1
最佳答案
解决方案 1:需要更改创建的自定义分析器并将其添加到字段名称中
要点 1:在映射中添加小写分词器
Whitespace tokenizer 不会将标记转换为小写。在同义词列表中,您添加了 'Television'
但您查询的是 'television'
。
添加Lowercase Token Filter在您的映射中如下所示,您的查询将为您提供预期的结果。
要点2:在field-name中添加analyzer
检查 prd_name
我在下面的映射中创建的方式。请注意,我已经向其中添加了分析器。
映射
PUT products
{
"settings":{
"index":{
"analysis":{
"analyzer":{
"synonym":{
"tokenizer":"whitespace",
"filter":[
"synonym",
"lowercase"
]
}
},
"filter":{
"synonym":{
"type":"synonym",
"synonyms_path":"analysis/synonym.txt"
}
}
}
}
},
"mappings":{
"mydocs":{
"properties":{
"prd_name":{
"type":"text",
"analyzer":"synonym",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
}
}
}
请注意,任何映射更改都需要您重新创建 索引并再次摄取 文档。
确保您的同义词文件在所有节点中都可用。
如果有帮助,请告诉我。
方案二:重新定义默认分析器
如果您无法更改字段的映射,您可以做的是,在设置中创建一个名称为 default
的分析器
基本上使用与分析器同义词
完全相同的设置重新定义默认
分析器。
那样的话,它将使用默认分析器而不是 standard
分析器,并且不需要更改字段名称的映射。
下面是这种情况下的映射方式。
映射
PUT <your_index_name>
{
"settings":{
"index":{
"analysis":{
"analyzer":{
"default":{
"tokenizer":"whitespace",
"filter":[
"synonym",
"lowercase"
]
}
},
"filter":{
"synonym":{
"type":"synonym",
"synonyms_path":"analysis/synonym.txt"
}
}
}
}
},
"mappings":{
"mydocs":{
"properties":{
"prd_name":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
}
}
}
请注意,我只是在映射中将 synonym
重命名为 default
。
重要说明:您可能需要重新索引所有数据才能使更改生效。如果您确实想出必须更改映射、重新索引所有数据,并且您可以做任何您想要的 w.r.t 字段名称,那么我强烈建议解决方案 1。
如果这有帮助,请告诉我:)
关于elasticsearch - 在 elasticsearch 中使用同义词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53643118/