我正在尝试使用mongo db为我的食谱网站实现一个搜索引擎。我正在尝试向用户显示预先键入窗口小部件框中的搜索建议。
我甚至尝试支持拼写错误的查询(Levenshtein distance)。
例如:每当用户输入'pza‘时,提前输入应该显示’pza‘作为建议之一。
如何使用mongodb实现这样的功能?
请注意,搜索应该是即时的,因为搜索结果将由预先键入的小部件获取。我将对其运行搜索查询的集合最多有100万个条目。
我想实现levenshtein距离算法,但这会降低性能,因为集合很大。
我在mongo 2.6中读到的FTS (全文搜索)现在非常稳定,但我的要求是近似匹配,而不是FTS。FTS不会将“pza”返回为“pza”。
请给我推荐一下有效的方法。
我正在使用node js mongodb本机驱动程序。
发布于 2015-01-16 12:31:23
MongoDB中的text search特性(在2.6版本中)没有任何用于模糊/部分字符串匹配的内置特性。正如您已经注意到的,当前的用例主要关注使用基本的布尔运算符和单词/短语匹配提供的语言和词干支持。
有几种可能的方法可以考虑模糊匹配,这取决于您的需求和您希望如何定义“高效”(速度、存储、开发人员时间、所需的基础设施等):
有关更详细的示例,请参阅:Efficient Techniques for Fuzzy and Partial matching in MongoDB.
例如,参见:How to Perform Fuzzy-Matching with Mongo Connector and Elastic Search。注:ElasticSearch的fuzzy query是基于Levenshtein距离的。
typeahead.js
这样的自动补全库,它包括一个建议引擎和查询/缓存API。Typeahead实际上是对任何其他后端方法的补充,它的(可选)建议引擎Bloodhound支持在本地存储中预取和缓存数据。发布于 2016-03-01 11:38:24
最好的情况是使用elasticsearch模糊查询:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html
它支持开箱即用的levenshtein距离算法,并具有对您的需求有用的附加功能,例如:-更像这样-功能强大的方面/聚合-自动完成
https://stackoverflow.com/questions/27977575
复制