【问题标题】:mongodb approximate string matchingmongodb近似字符串匹配
【发布时间】:2015-01-16 05:01:26
【问题描述】:

我正在尝试使用 mongo db 为我的食谱网站实现搜索引擎。 我正在尝试在预先输入的小部件框中向用户显示搜索建议。

我什至试图支持拼写错误的查询(levenshtein distance)。

例如:每当用户输入“pza”时,预输入应显示“pizza”作为建议之一。

如何使用 mongodb 实现这样的功能?

请注意,搜索应该是即时的,因为搜索结果将由预先输入的小部件获取。我将运行搜索查询的集合最多有 100 万个条目。

我想过实现 levenshtein 距离算法,但这会降低性能,因为收集量很大。

我在 mongo 2.6 中阅读的 FTS(全文搜索)现在相当稳定,但我的要求是近似匹配,而不是 FTS。 FTS 不会为“pizza”返回“pza”。

请推荐我有效的方法。

我正在使用 node js mongodb 原生驱动。

【问题讨论】:

  • 如果您真的想要这种结果,那么您最好实施一个已经完成 OOTB 的外部搜索引擎解决方案。 MongoDB 的文本搜索功能旨在成为“最小”案例。您可以始终将主存储库保留在 MongoDB 中,并且现有流行产品的连接器说明。
  • 对于我们这些不熟悉这个概念的人来说,这只是一个方便的 Levenshtein Distance 链接:people.cs.pitt.edu/~kirk/cs1501/Pruhs/Spring2006/assignments/…

标签: node.js mongodb


【解决方案1】:

MongoDB 中的text search 功能(在 2.6 中)没有任何用于模糊/部分字符串匹配的内置功能。正如您所指出的,该用例目前侧重于使用基本布尔运算符和单词/短语匹配的语言和词干支持。

根据您的要求以及您希望如何限定“高效”(速度、存储、开发时间、所需的基础设施等),有几种可能的模糊匹配方法可供考虑:

  • 使用一些现成的相似和相似算法在您的应用程序逻辑中实现对模糊/部分匹配的支持。这种方法的好处包括无需添加任何额外的基础架构,并且能够根据您的要求进行密切调整。

    更多详细示例,请参见:Efficient Techniques for Fuzzy and Partial matching in MongoDB

  • 与提供更高级搜索功能的外部搜索工具集成。这会为您的部署增加一些复杂性,并且可能只是为了预先输入而过度使用,但您可能会发现您希望在应用程序的其他地方合并的其他搜索功能(例如“like this”、单词邻近度、分面搜索......)。

    例如参见:How to Perform Fuzzy-Matching with Mongo Connector and Elastic Search。注意:ElasticSearch 的fuzzy query 是基于 Levenshtein 距离的。

  • 使用自动完成库,例如 Twitter 的开源 typeahead.js,其中包括建议引擎和查询/缓存 API。 Typeahead 实际上是对任何其他后端方法的补充,其(可选)建议引擎 Bloodhound 支持预取以及在本地存储中缓存数据。

【讨论】:

    【解决方案2】:

    最好的情况是使用弹性搜索模糊查询: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html

    它支持开箱即用的 levenshtein 距离算法,并具有对您的要求有用的附加功能,即: - 更像这样 - 强大的方面/聚合 - 自动完成

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2013-07-10
      • 2010-09-08
      • 2016-03-28
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      相关资源
      最近更新 更多