MySQL实现近似匹配搜索的正确方法

jum*_*awn 1 mysql search backend node.js

我的 MySQL 数据库中有一个表,其中有两个(相关)列:“id”和“用户名”。

读过,MySQL和关系数据库一般来说并不是搜索字符串上近似匹配的最佳选择,所以我想知道,实现简单但不完全匹配的搜索功能的行业实践是什么 - 例如,当一个人通过以下方式搜索帐户时Facebook 上的姓名和显示的不完全匹配?我在研究这个问题时发现了 Apache Lucene,但这似乎用于索引网站页面,不一定是数据库表中的任意字符串。

是否有适合此用例的外部工具?似乎此任务的任何 SQL 查询都需要完整扫描,即使它只是查找是否包含子字符串。

Jul*_*sio 5

根据您的情况,我建议您使用 Elasticsearch 而不是关系数据库。该搜索引擎是用于实现搜索和分析功能的强大工具。Elasticsearch还灵活且通用,具有丰富的查询语言,使用JSON作为查询语言并支持许多不同类型的数据。

当然,还支持近似匹配搜索。正如你所说,MySQL 和其他关系数据库不建议使用近似匹配搜索,它们不是用于此目的。

- - - - - - - 更新 - - - - - -

如果您想使用关系数据库进行全文搜索,这是可能的,但如果您的用户数量增加很多,您可能会遇到扩展问题。请记住,ElasticSearch 非常强大且功能强大,因此,您可以在这个搜索引擎中轻松执行多种类型的搜索,但它也可能更昂贵。当我建议您使用 ElasticSearch 时,我正在考虑扩展搜索。但自从我回答以来,我一直在思考你的问题,并且我明白你只需要一个简单的全文搜索。总而言之,一开始您只能使用关系数据库来做到这一点,但将来您可能会将搜索转移到 ElasticSearch 或者如果您的搜索变得复杂。

按照本指南在 Postgresql 中进行全文搜索。http://rachbelaid.com/postgres-full-text-search-is-good-enough/

MySql 中还有另一个示例:https://sjhannah.com/blog/2014/11/03/using-soundex-and-mysql-full-text-search-for-fuzzy-matching/

就像我在评论中所说的,这是你必须做的权衡。您可以在开始时更喜欢使用 ElasticSearch,也可以选择其他数据库并在将来迁移到 ElasticSearch。

我还向您推荐这本书:设计数据密集型应用程序:可靠、可扩展和可维护系统背后的大创意。实际上我正在读这本书,它会帮助你理解这个主题。

- - - - - - - 更新 - - - - - -

要在 ElasticSearch 中实现近似匹配搜索,您可以使用模糊匹配查询。模糊匹配查询允许您控制匹配的宽松程度,例如下面的查询:

{
  "query": {
    "fuzzy": {
      "username": {
        "value": "julienambrosio",
        "fuzziness": 2
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

他们将返回“julienambrosio”,例如“julienambrosio1”、“julienambrosio12”或“julienambrosio”。

您可以调整模糊程度来控制匹配的宽松/严格程度。

在创建此示例之前,您应该学习有关 ElasticSearch 的更多信息。udemy、youtube等有很多课程。

您可以在官方文档中阅读更多相关内容。