gpt4 book ai didi

elasticsearch - 在 elasticsearch 中使用同义词

转载 作者:行者123 更新时间:2023-12-02 22:28:18 26 4
gpt4 key购买 nike

我正在尝试在我的搜索实现中实现同义词文件。我找到了许多文档作为实现指南,但最终无法找到可行的解决方案。

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com