我正在使用elasticsearch 7.0.0
。
我在创建synonyms
时尝试使用此配置来处理index
。
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "whitespace",
"filter": [
"synonym"
]
}
},
"filter": {
"synonym": {
"type": "synonym",
"synonyms_path": "synonyms.txt"
}
}
}
}
},
"mappings": {
"properties": {
"address.state": {
"type": "text",
"analyzer": "synonym"
},
"location": {
"type": "geo_point"
}
}
}
}
这是插入索引的文档:
{
"name": "Berry's Burritos",
"description": "Best burritos in New York",
"address": {
"street": "230 W 4th St",
"city": "New York",
"state": "NY",
"zip": "10014"
},
"location": [
40.7543385,
-73.976313
],
"tags": [
"mexican",
"tacos",
"burritos"
],
"rating": "4.3"
}
也包含在
synonyms.txt
中:ny, new york, big apple
当我尝试在
address.state
属性中搜索任何内容时,我得到empty
结果。这是查询:
{
"query": {
"bool": {
"filter": {
"range": {
"rating": {
"gte": 4
}
}
},
"must": {
"match": {
"address.state": "ny"
}
}
}
}
}
即使在查询中使用
ny
(因为它是:没有同义词),结果也为空。以前,当我创建不带
mappings
的索引时,该查询用于提供结果,仅同义词除外。但是现在有了
mappings
,即使存在该术语,结果还是为空。该查询虽然有效:
{
“查询”:{
“请求参数”: {
“query”:“炸 Jade 米饼”,
“字段”:[
“标签”
]
}
}
}
我查看并研究了许多文章/教程,并提出了到目前为止的建议。
我现在在这里想念什么?
最佳答案
编制索引时,您将值传递为"state":"NY"
。注意NY
的情况。设置中定义的分析器synonym
仅具有一个过滤器,即synonym
。由于大小写,NY
与synonym.txt中定义的任何同义词集都不匹配。注意NY
不等于ny
。为了克服这个问题(或者我们可以称其为不区分大小写),请在lowercase
过滤器之前向synonym
分析器添加synonym
过滤器。这将确保所有输入文本均先小写,然后再应用同义词过滤器。当您使用全文搜索查询在该字段上搜索时,也会发生同样的情况。
因此您的设置将如下所示:
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "whitespace",
"filter": [
"lowercase",
"synonym"
]
}
},
"filter": {
"synonym": {
"type": "synonym",
"synonyms_path": "synonyms.txt"
}
}
}
}
}
映射中不需要任何更改。为什么最初起作用?
答案是因为没有定义任何映射时,elastic会将
address.state
映射为text
字段,而没有为该字段定义任何显式分析器。在这种情况下,elasticsearch默认使用standard analyzer,后者使用小写标记过滤器作为过滤器之一。因此查询与文档匹配。关于elasticsearch - elasticsearch同义词分析器给出0个结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55666197/