mongodb近似字符串匹配

时间:2015-01-16 05:01:27

标签: node.js mongodb

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

我甚至试图支持错误拼写的查询(levenshtein距离)。

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

如何使用mongodb实现此类功能?

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

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

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

请以有效的方式推荐我。

我正在使用节点js mongodb本机驱动程序。

2 个答案:

答案 0 :(得分:15)

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

根据您的要求以及您希望如何“高效”(速度,存储,开发人员时间,所需的基础架构等),有几种可能的方法可以考虑进行模糊匹配:

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

    有关更详细的示例,请参阅:Efficient Techniques for Fuzzy and Partial matching in MongoDB

  • 与提供更高级搜索功能的外部搜索工具集成。这为您的部署增加了一些复杂性,并且可能只是针对typeahead而言过度杀伤,但您可能会发现其他搜索功能要包含在应用程序的其他位置(例如“喜欢这样”,单词接近,分面搜索,......)。

    例如,请参阅:How to Perform Fuzzy-Matching with Mongo Connector and Elastic Search。注意:ElasticSearch的{​​{3}}基于Levenshtein距离。

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

答案 1 :(得分:1)

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

它支持开箱即用的levenshtein距离算法,并具有可满足您要求的其他功能,即: - 更像这样 - 强大的方面/聚合 - 自动填充