我正在尝试在搜索实现中实现同义词文件。我发现许多文档是实现该准则的指南,但最终没有可行的解决方案。
首先,我添加了以下分析器:
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
答案 0 :(得分:1)
第1点:在映射中添加小写标记器
Whitespace令牌生成器不会将令牌转换为小写。在同义词列表中,您添加了'Television'
,但您正在查询'television'
。
按如下所示在映射中添加Lowercase Token Filter,您的查询将为您提供预期的结果。
第2点:将分析器添加到字段名称
在下面的映射中检查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
的分析器
基本上使用与分析器default
完全相同的设置重新定义synonym
分析器。
这样,它将成为默认的分析器,而不是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
。
重要说明::您需要以某种方式为所有数据重新编制索引,以使更改生效。如果确实需要更改映射,重新索引所有数据并且可以执行任何需要使用字段名的操作,那么我强烈建议使用解决方案1。
让我知道这是否有帮助:)