elasticsearch - elasticsearch 同义词分析器给出 0 个结果
问题描述
我正在使用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": { "query_string": { "query": "tacos", "fields": [ "tags" ] } } }
我查看并研究了许多文章/教程并提出了这么多。
我现在在这里缺少什么?
解决方案
在建立索引时,您将值传递为"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 默认使用标准分析器,该分析器使用小写标记过滤器作为过滤器之一。因此查询与文档匹配。
推荐阅读
- sql - 在 Hive SQL 中选择上一个值
- android - 将 JSON 用于 Google 地图:标记未显示
- c++ - fstream 在替代控制字符处停止读取
- css - CSS 属性 background-clip:text 在 chrome 或 safari 中对我不起作用
- kubernetes - KOPS 集群上的 Argo Workflow 分布
- javascript - 上传 csv 文件并将多个标记添加到谷歌地图
- python - 根据名称 pandas python 对某些列进行乘法和求和
- swift - 更改所需属性将字段留空
- reactjs - 服务器端渲染中的 React-router 和 Link
- colors - 使用 Seaborn stripplot 中的一系列值设置色调