elasticsearch - 在 elasticsearch 中使用同义词

标签 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:需要更改创建的自定义分析器并将其添加到字段名称中

要点 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/

相关文章:

java - StandardTokenizer 是否删除标点符号(在 Lucene 4.1 中)

logging - 如果适用,获取Logstash将syslog消息字符串视为JSON

elasticsearch - ELK 上的通知系统

Elasticsearch 术语方面不显示否定术语

elasticsearch - Elasticsearch查询过滤出列表中值为A而不为B的结果

elasticsearch - 无法将索引插入AKS上的ElasticSearch DB容器

php - 如何在查询时删除solr中的动态字段后缀,如_i,_ txt?

java - Solr 搜索返回部分字符串匹配

lucene - Elasticsearch:关键字分析字段的PrefixQuery中的连字符

search - 使用 Lucene 处理数据库数据