模糊查询旨在用于在一定距离内找到完整查询的近似值:
我是Elastic Search的新手,在查询时遇到了两个问题。我有一个简单的Mongodb数据库,其中包含感兴趣的城市和景点。每个集合都有一个cityName和其他详细信息(例如网站等),还有一个places对象数组。这是我的映射;
{
"mappings": {
"properties": {
"cityName": {
"type": "text"
},
"phone": {
"type": "keyword"
},
"email": {
"type": "keyword"
},
"website": {
"type": "keyword"
},
"notes": {
"type": "keyword"
},
"status": {
"type": "keyword"
},
"places": {
"type": "nested",
"properties": {
"name": {
"type": "text"
},
"status": {
"type": "keyword"
},
"category": {
"type": "keyword"
},
"reviews": {
"properties": {
"rating": {
"type": "long"
},
"comment": {
"type": "keyword"
},
"user": {
"type": "nested"
}
}
}
}
}
}
}
}
我需要一个模糊查询,用户可以在其中搜索cityName和places.name,但是当我搜索单个单词时,我会得到结果,添加多个单词将返回0个匹配。我肯定我在这里缺少什么,因为我两天前开始学习弹性搜索。以下查询返回结果,因为我有一个cityName: Islamabad
和places
数组的文档,其对象的name
中带有关键字Islamabad,在某些places
中,关键字Islamabad位于place.name
的开头,在某些places
对象中,可能在中间或结尾
这是我正在使用的:只有一个单词时返回结果
{
"query": {
"bool": {
"should": [
{
"fuzzy": {
"cityName": "Islamabad"
}
},
{
"nested": {
"path": "places",
"query": {
"fuzzy": {
"places.name": "Islamabad"
}
}
}
}
]
}
}
}
当我确实有名称为club
和Islamabad club
的地方时,向上面的查询添加另一个词,例如,Islamabad Golf club
会返回0次匹配>
问题
搜索查询是从应用程序发送的,因此它是动态的,因此cityName
和places.name
的搜索词是相同的,并且places.name
并不总是包含cityName
。我到底需要什么?
我需要一个查询,我可以在其中搜索cityName和位置数组(仅搜索places.name)。该查询应为Fuzzy类型,以便在单词Islamabad
拼写为Islambad
时仍返回结果,甚至返回Islam
或Abad
的结果。而且查询还应该返回多个单词的结果,我肯定在那里做错了什么。任何帮助,将不胜感激。** P.S:**我实际上是使用MongoDB作为数据库,但是仅迁移到Elastic Search以改善我们的搜索功能。我用MongoDB尝试了不同的方法,使用了mongoose-fuzzy-searching
npm模块,但是那没有用,所以如果MongoDB有一个更简单的解决方案,请也分享。
谢谢。
编辑1:
我必须更改数据的结构(映射)。现在,我有2个独立的索引,一个索引包含具有城市详细信息和cityId
的城市,另一个索引针对所有地点,每个索引都有一个cityId
,该索引将在以后需要时用于连接。每个地方都有一个cityName
键,因此我将只搜索地方索引,因为它具有所有详细信息(地方名称和城市名称)。
我有一个城市,名字中包含单词Welder's
,并且同一位置内的某些地方的名称中也包含单词Welder's
,其中包含type:text
。但是,当搜索welder
时,以下两个查询都不会返回这些文档,而对welders
或welder's
的搜索会返回这些文档。我不确定为什么welder
与Welder's*
不匹配。我在创建两个索引的过程中都没有指定任何分析器,我也没有在查询中明确定义它,任何人都可以帮助我解决这个查询,以便它按预期运行:
查询1:
] >>] >>{ "query": { "bool": { "should": [ { "match": { "name": { "query": "welder", "fuzziness": 20 } } }, { "match": { "cityName": { "query": "welder", "fuzziness": 20 } } } ] } } }
查询2:
{ "query": { "match": { "name": { "query": "welder", "fuzziness": 20 } } } }
我是Elastic Search的新手,在查询时遇到了两个问题。我有一个简单的Mongodb数据库,其中包含感兴趣的城市和景点。每个集合都有一个cityName和其他...
模糊查询旨在用于在一定距离内找到完整查询的近似值:
要查找相似的术语,模糊查询会创建一组变体
或指定编辑中搜索词的扩展距离。然后,查询返回完全匹配项
如果您不能允许查询中单个词的模糊匹配,则需要使用已激活模糊性的匹配查询。
POST <your_index>/_search { "query": { "bool": { "should": [ { "match": { "cityName": { "query": "Islamabad golf", "fuzziness": "AUTO" } } }, { "nested": { "path": "places", "query": { "match": { "places.name": { "query": "Islamabad golf", "fuzziness": "AUTO" } } } } } ] } } }
提醒: Elasticsearch中的模糊性允许每项最多2次更正。因此,您将永远无法将
Islam
与Islamabad
匹配,因为这些术语之间有4个变化。有关距离和模糊性参数的更多信息,请参阅此文档页面fuzziness parameters
模糊查询旨在用于在一定距离内找到完整查询的近似值: