elasticsearch 如何使用Elasticsearch实现与Algolia相同的功能
我花了大约一个星期的时间修补Elasticsearch。我正在尝试创建一个搜索查询,该查询将在文档的所有字段上启用子字符串搜索“kua lum”=>“kuala lumpur”和模糊搜索“koala lumpur”=>“kuala lumpur”。到目前为止,我已经了解到,在多字段模糊搜索中使用multi_match,在子字符串搜索中使用通配符不能使用nGram,因为它会破坏模糊搜索,但实际上没有关于如何组合它们的信息 昨天我尝试了一下Algolia,它做了我需要的一切。不幸的是,我使用的是敏感数据,因此我不允许在本地基础设施之外托管这些数据,即使Algolia提供了内部部署,我担心这对我的香蕉共和国来说太贵了 所以我想我被Elasticsearch困住了。有可能让它做我想让它做的吗? 我也可以尝试其他搜索引擎elasticsearch 如何使用Elasticsearch实现与Algolia相同的功能,elasticsearch,search,algolia,fuzzy,elasticsearch,Search,Algolia,Fuzzy,我花了大约一个星期的时间修补Elasticsearch。我正在尝试创建一个搜索查询,该查询将在文档的所有字段上启用子字符串搜索“kua lum”=>“kuala lumpur”和模糊搜索“koala lumpur”=>“kuala lumpur”。到目前为止,我已经了解到,在多字段模糊搜索中使用multi_match,在子字符串搜索中使用通配符不能使用nGram,因为它会破坏模糊搜索,但实际上没有关于如何组合它们的信息 昨天我尝试了一下Algolia,它做了我需要的一切。不幸的是,我使用的是敏感
upd:试用了MeiliSearch,开箱即用Elastic提供了极其灵活的全文搜索功能 实现这一目标可能有多种方式。如果你事先知道你的搜索库,你可以用它 否则,始终可以将两个查询合并为一个“应该”布尔查询 或者,当你搜索“吉隆坡”时,这样的查询也会返回“吉隆坡”,尽管分数会少得多
{
"query": {
"multi_match": {
"fields": [
"city"
],
"query": "kual lum",
"type": "best_fields",
"operator": "or",
"fuzziness": "AUTO"
}
}
}
现在,您可以使用模糊因子来满足您的需要尝试将其设置为2,以获得您想要的,它会发挥神奇的作用,但请注意该因子,因为它可能会影响您的搜索性能
您应该避免使用通配符,因为它们占用大量资源
另一种方法是将每个单词作为单独的搜索词,并将它们传递给多个“应该”查询。Elastic提供了极其灵活的全文搜索功能 实现这一目标可能有多种方式。如果你事先知道你的搜索库,你可以用它 否则,始终可以将两个查询合并为一个“应该”布尔查询 或者,当你搜索“吉隆坡”时,这样的查询也会返回“吉隆坡”,尽管分数会少得多
{
"query": {
"multi_match": {
"fields": [
"city"
],
"query": "kual lum",
"type": "best_fields",
"operator": "or",
"fuzziness": "AUTO"
}
}
}
现在,您可以使用模糊因子来满足您的需要尝试将其设置为2,以获得您想要的,它会发挥神奇的作用,但请注意该因子,因为它可能会影响您的搜索性能
您应该避免使用通配符,因为它们占用大量资源
另一种方法是将每个单词作为一个单独的搜索词,并将它们传递给多个“应该”查询。尝试将其设置为4或5-ES支持0,1,2的模糊性。谢谢@SahilGupta指出,我使用了一个相当旧的版本。谢谢你的回答。这是我尝试的第一件事,但决不是真正的前缀匹配。它使用默认的模糊性规则,因此只有在已经拼写了len-2字符时才开始工作。想象一下,如果这座城市被称为“吉隆坡”。我希望仍然可以使用“kua-lum”查询找到它。我需要前缀匹配或模糊搜索,前缀不能拼写错误。你能举一个“应该”查询的例子吗?我自己尝试过,但没有让它与“multi_match”和“wildcard”一起工作。因此,ES中的任何文本字段都会在存储到反向索引之前进行分析和标记。当您在索引中存储吉隆坡时,它会标记为吉隆坡和吉隆坡。当你搜索吉隆坡时,这两个词都会在你的反向索引中被搜索到。我更新了我的答案,在搜索字符串中的单词中有一个or'd响应。“or”操作符将确保如果任何单词匹配,您将得到响应。希望这有助于检查编辑后的答案,opreator:并在单词上像逻辑and一样工作。您需要使用运算符:or。尝试将其设为4或5-ES仅支持0,1,2的模糊性谢谢@SahilGupta指出,我使用的是一个非常旧的版本。谢谢您的回答。这是我尝试的第一件事,但决不是真正的前缀匹配。它使用默认的模糊性规则,因此只有在已经拼写了len-2字符时才开始工作。想象一下,如果这座城市被称为“吉隆坡”。我希望仍然可以使用“kua-lum”查询找到它。我需要前缀匹配或模糊搜索,前缀不能拼写错误。你能举一个“应该”查询的例子吗?我自己尝试过,但没有让它与“multi_match”和“wildcard”一起工作。因此,ES中的任何文本字段都会在存储到反向索引之前进行分析和标记。当您在索引中存储吉隆坡时,它会标记为吉隆坡和吉隆坡。当你搜索吉隆坡时,这两个词都会在你的反向索引中被搜索到。我更新了我的答案,在搜索字符串中的单词中有一个or'd响应。“or”操作符将确保如果任何单词匹配,您将得到响应。希望这对你有帮助 检查编辑后的答案,opreator:并在单词上像逻辑and一样工作。您需要使用运算符:或。