我正在尝试使用mongo db为我的食谱网站实现一个搜索引擎.我正在尝试向用户显示预先输入小部件框中的搜索建议.
我甚至试图支持错误拼写的查询(levenshtein距离).
例如:每当用户输入'pza'时,输入提前应显示'pizza'作为建议之一.
如何使用mongodb实现此类功能?
请注意,搜索应该是即时的,因为搜索结果将由提前输入小部件提取.我将运行搜索查询的集合最多有100万个条目.
我想过实施levenshtein距离算法,但这会降低性能,因为收集很大.
我在mongo 2.6中阅读FTS(全文搜索)现在相当稳定,但我的要求是近似匹配,而不是FTS.FTS不会为'pizza'返回'pza'.
请推荐我有效的方法.
我正在使用节点js mongodb本机驱动程序.
Ste*_*nie 18
MongoDB中的文本搜索功能(如2.6)没有任何内置的模糊/部分字符串匹配功能.正如您所指出的,该用例目前主要关注语言和基本布尔运算符和单词/短语匹配的词干支持.
根据您的要求以及您希望如何"高效"(速度,存储,开发人员时间,所需的基础架构等),有几种可能的方法可以考虑进行模糊匹配:
使用一些现成的声音相似算法实现对应用程序逻辑中模糊/部分匹配的支持.这种方法的好处包括不必添加任何额外的基础设施,并能够根据您的要求密切调整匹配.
有关更详细的示例,请参阅:MongoDB中模糊和部分匹配的高效技术.
与提供更高级搜索功能的外部搜索工具集成.这为您的部署增加了一些复杂性,并且对于预先输入可能有点过分,但您可能会发现其他搜索功能要包含在应用程序的其他位置(例如"喜欢这个",单词接近,分面搜索,......).
例如,请参阅:如何使用Mongo Connector和Elastic Search执行模糊匹配.注意:ElasticSearch的模糊查询基于Levenshtein距离.
使用自动完成库,如Twitter的开源typeahead.js
,其中包括建议引擎和查询/缓存API.Typeahead实际上是对任何其他后端方法的补充,它的(可选)建议引擎Bloodhound支持预取以及在本地存储中缓存数据.