在Elasticsearch中使用同义词

时间:2018-12-06 01:04:23

标签: elasticsearch lucene

我正在尝试在搜索实现中实现同义词文件。我发现许多文档是实现该准则的指南,但最终没有可行的解决方案。

首先,我添加了以下分析器:

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 个答案:

答案 0 :(得分:1)

解决方案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
                  }
               }
            }
         }
      }
   }
}

请注意,任何映射更改都将要求您重新创建索引并再次嵌入文档。

确保您的同义词文件在所有节点中都可用。

让我知道是否有帮助。

解决方案2:重新定义默认分析器

如果无法更改字段的映射,可以做的是,在设置中创建名称为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。

让我知道这是否有帮助:)