问题描述
我花了大约一周的时间来修补Elasticsearch。我正在尝试创建一个搜索查询,该查询将对文档的所有字段启用子字符串搜索('kua lum'=>'kuala lumpur')和模糊搜索('koala lumpur'=>'kuala lumpur')。到目前为止,我了解到您使用 multi_match 进行多字段模糊搜索,并且使用通配符进行子字符串搜索(不能使用nGram,因为它会破坏模糊搜索),但实际上没有有关如何组合它们的信息。
昨天,我尝试了Algolia,它立即完成了我需要的所有操作。不幸的是,我正在使用敏感数据,因此不允许将其托管在本地基础结构之外,即使Algolia确实提供了本地服务,我担心对于我的香蕉共和国来说,它也太昂贵了。
所以我想我坚持使用Elasticsearch。是否可以使它做我想做的事? 我也可以自由尝试其他搜索引擎。
upd:尝试过MeiliSearch,可以直接使用
解决方法
Elastic提供了非常灵活的全文本搜索功能。
可能有多种方法可以实现它。如果您事先知道搜索基础,则可以使用synonyms filter。
否则,您始终可以将两个查询合并为一个“应该”布尔查询。
或者这样的查询也会在您搜索“ kual lump”时返回“吉隆坡”,尽管得分会少得多
{
"query": {
"multi_match": {
"fields": [
"city"
],"query": "kual lum","type": "best_fields","operator": "or","fuzziness": "AUTO"
}
}
}
现在,您可以根据需要使用模糊性因子(尝试将其设为2,以获得所需的内容),它具有魔力,但请记住该因子,因为它可能会影响搜索性能。
您应该避免使用通配符,因为通配符会占用大量资源。
另一种方法是将每个单词视为一个单独的搜索词,并将其传递给多个“应”查询。