elasticsearch - 如何使用 Elasticsearch 实现与 Algolia 相同的功能
问题描述
我花了大约一周的时间修补 Elasticsearch。我正在尝试创建一个搜索查询,它将在文档的所有字段上启用子字符串搜索 ('kua lum' => 'kuala lumpur') 和模糊搜索 ('koala lumpur' => 'kuala lumpur')。到目前为止,我了解到您使用multi_match进行多字段模糊搜索,并使用通配符进行子字符串搜索(不能使用 nGram,因为它会破坏模糊搜索),但实际上没有关于如何组合它们的信息。
昨天我尝试了 Algolia,它开箱即用地完成了我需要的一切。不幸的是,我正在处理敏感数据,因此我不允许将其托管在本地基础设施之外,即使 Algolia 确实提供了本地部署,我担心它对于我的香蕉共和国来说太贵了。
所以我想我被 Elasticsearch 困住了。有没有可能让它做我想做的事?我也可以自由尝试其他搜索引擎。
upd:试过MeiliSearch,开箱即用
解决方案
Elastic 提供了极其灵活的全文搜索功能。
可能有多种方法可以实现它。如果您事先知道您的搜索基础,您可以使用synonyms filter。
否则,您始终可以将两个查询合二为一,作为“应该”布尔查询。
或者这样的查询也会在您搜索“kual lump”时返回“Kuala Lumpur”,尽管分数会低得多
{
"query": {
"multi_match": {
"fields": [
"city"
],
"query": "kual lum",
"type": "best_fields",
"operator": "or",
"fuzziness": "AUTO"
}
}
}
现在,您可以使用模糊因子来满足您的需要(尝试将其设为 2,以获得您想要的),它具有魔力,但请注意该因子,因为它可能会影响您的搜索性能。
您应该避免使用通配符,因为它们非常耗费资源。
另一种方法是将每个单词视为一个单独的搜索词,并将它们传递给多个“应该”查询。
推荐阅读
- reactjs - 如何正确分离组件中的功能?
- assembly - 如何调用一个程序并打印它?
- javascript - D3 Robinson 投影给出曲线纬度线
- python - Python:JSON 与 sqlite 的查询性能?
- javascript - 在外部单击时尝试隐藏模型具有不同的效果
- python - 如何将 Microsoft .docx 文件从 Angular 发送到 Python 后端而不破坏它?
- c# - 使用带有 include/then_include 的 linq 查询与使用带有连接和 gettng db 服务器错误的 sql 查询
- php - 我正在尝试使用 PHPmailer 发送电子邮件,但我收到此错误
- node.js - 在同一集合中创建对象的 mongodb 模式数组或创建新集合的更好方法保存引用
- javascript - FETCH 辅助函数在调用 setState() 时返回未定义