我正在使用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”:“炸玉米饼”, “字段”:[ “标签” ] } } }
我查看并研究了许多文章/教程,并提出了到目前为止的建议。
我现在在这里想念什么?
答案 0 :(得分:3)
建立索引时,您将值传递为"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,后者将小写标记过滤器用作过滤器之一。因此查询与文档匹配。