mongodb近似string匹配

我正在尝试使用mongo db为我的食谱网站实现一个search引擎。 我正在尝试在提前输出窗口小部件框中向用户显示searchbuild议。

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

例如:无论何时用户input“pza”,input提示都应该显示“pizza”作为其中一个build议。

我如何使用mongodb实现这样的function?

请注意,search应该是即时的,因为search结果将通过input提示部件获取。 我将运行search查询的集合最多有一百万个条目。

我想实现levenshtein距离algorithm,但是这会减慢性能,因为收集是巨大的。

我在mongo 2.6阅读FTS(全文search)现在比较稳定,但是我的要求是近似匹配,而不是FTS。 FTS不会为“披萨”返回“pza”。

请推荐我有效的方法。

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

MongoDB中的文本searchfunction(如2.6)没有任何模糊/部分string匹配的内置function。 如您所知,用例目前主要集中在基本布尔运算符和词/词匹配的语言和词干支持上。

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

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

    有关更详细的示例,请参阅: 有效的MongoDB中的模糊和部分匹配技术 。

  • 与提供更高级searchfunction的外部search工具集成。 这给你的部署增加了一些复杂性,并且可能过于简单,但是你可能会发现你想在你的应用程序的其他地方join其他searchfunction(例如“像这样”,单词接近,多面search等等)。

    例如,请参阅: 如何使用Mongo Connector和弹性search执行模糊匹配 。 注意:ElasticSearch的模糊查询基于Levenshtein距离。

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

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

它支持levenshtein距离algorithm开箱,并有其他function,可以为您的要求有用,即: – 更像这样 – 强大的方面/聚合 – 自动完成