[英]Elastic search fuzzy query unexpected results
我有 2 个索引,城市和地点。 Places one 有这样的映射:
{
"mappings": {
"properties": {
"cityId": {
"type": "integer"
},
"cityName": {
"type": "text"
},
"placeName": {
"type": "text"
},
"status": {
"type": "keyword"
},
"category": {
"type": "keyword"
},
"reviews": {
"properties": {
"rating": {
"type": "long"
},
"comment": {
"type": "keyword"
},
"user": {
"type": "nested"
}
}
}
}
}
}
而 City is index 是这样映射的:
{
"mappings": {
"properties": {
"state": {
"type": "keyword"
},
"postal": {
"type": "keyword"
},
"phone": {
"type": "keyword"
},
"email": {
"type": "keyword"
},
"notes": {
"type": "keyword"
},
"status": {
"type": "keyword"
},
"cityName": {
"type": "text"
},
"website": {
"type": "keyword"
},
"cityId": {
"type": "integer"
}
}
}
}
最初我们有一个单个文档,其中城市嵌入了地点,但我在搜索嵌套地点数组时遇到了麻烦,所以我将结构更改为这个,我希望能够在一个模糊的查询中同时搜索 cityName 和 placeName。 我有一个城市,在它的名字中包含了 Welder's 这个词,并且同一地点内的一些地方在他们的名字中包含了 Welder's 这个词,它有一个类型:文本。 但是,当搜索焊工时,以下两个查询都不会返回这些文件,搜索焊工或焊工确实会返回这些文件。 我不确定为什么焊工与焊工*不匹配。 在创建这两个索引期间,我没有指定任何分析器,我也没有在查询中明确定义它,任何人都可以帮助我解决此查询,因此它的行为符合预期:
查询 1:索引 = 地点
{
"query": {
"bool": {
"should": [
{
"match": {
"placeName": {
"query": "welder",
"fuzziness": 20
}
}
},
{
"match": {
"cityName": {
"query": "welder",
"fuzziness": 20
}
}
}
]
}
}
}
查询 2:索引 = 地点
{
"query": {
"match": {
"placeName": {
"query": "welder",
"fuzziness": 20
}
}
}
}
任何人都可以发布一个查询,当传递一个词时,焊工会返回名称中包含焊工的文档(也应该适用于其他类似的术语,这只是一个例子)
编辑 1 :这是一个示例位置文档,我希望上面发布的任何查询都返回:
{
cityId: 29,
placeName: "Welder's Garage Islamabad",
cityName: "Islamabad",
status: "verified",
category: null,
reviews: []
}
使用您的映射和查询以及模糊度设置为“20”,我正在取回文档。 模糊性:20 将容忍搜索词和焊工之间的 20 编辑距离,因此即使“w”也会与“焊工”匹配。 我认为这个值在您的实际查询中是不同的。
如果您想搜索焊工或焊工并返回焊工,那么您可以使用词干标记过滤器
映射:
PUT indexfuzzy
{
"mappings": {
"properties": {
"cityId": {
"type": "integer"
},
"cityName": {
"type": "text"
},
"placeName": {
"type": "text",
"analyzer": "my_analyzer"
},
"status": {
"type": "keyword"
},
"category": {
"type": "keyword"
},
"reviews": {
"properties": {
"rating": {
"type": "long"
},
"comment": {
"type": "keyword"
},
"user": {
"type": "nested"
}
}
}
}
},
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"filter": [
"lowercase",
"stem_possessive_english",
"stem_minimal_english"
]
}
},
"filter": {
"stem_possessive_english": {
"type": "stemmer",
"name": "possessive_english"
},
"stem_minimal_english": {
"type": "stemmer",
"name": "minimal_english"
}
}
}
}
}
询问 :
GET indexfuzzy/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"placeName": {
"query": "welder"--> welder,welders,welder's will work
}
}
},
{
"match": {
"cityName": {
"query": "welder"
}
}
}
]
}
}
}
结果:
[
{
"_index" : "indexfuzzy",
"_type" : "_doc",
"_id" : "Jc-yx3ABd7NBn_0GTBdp",
"_score" : 0.2876821,
"_source" : {
"cityId" : 29,
"placeName" : "Welder's Garage Islamabad",
"cityName" : "Islamabad",
"status" : "verified",
"category" : null,
"reviews" : [ ]
}
}
]
所有格_english:- 从标记中删除尾随的 's minimum_english:- 删除复数
GET <index_name>/_analyze
{
"text": "Welder's Garage Islamabad",
"analyzer": "my_analyzer"
}
返回
{
"tokens" : [
{
"token" : "welder", --> will be matched for welder's, welders
"start_offset" : 0,
"end_offset" : 8,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "garage",
"start_offset" : 9,
"end_offset" : 15,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "islamabad",
"start_offset" : 16,
"end_offset" : 25,
"type" : "<ALPHANUM>",
"position" : 2
}
]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.