mongodb 近似字符串匹配
mongodb approximate string matching
我正在尝试使用 mongo 数据库为我的食谱网站实施搜索引擎。
我正在尝试在预先输入的小部件框中向用户显示搜索建议。
我什至试图支持拼写错误的查询(levenshtein 距离)。
例如:每当用户输入 'pza' 时,输入提示应显示 'pizza' 作为建议之一。
如何使用 mongodb 实现此类功能?
请注意,搜索应该是即时的,因为搜索结果将由预先输入的小部件获取。我要 运行 搜索查询的集合最多有 100 万个条目。
我想过实现 levenshtein 距离算法,但这会降低性能,因为集合很大。
我读了mongo中的FTS(Full Text Search) 2.6现在很稳定,但我的要求是近似匹配,而不是FTS。 FTS 不会 return 'pza' 'pizza'.
请推荐我有效的方法。
我正在使用节点 js mongodb 本机驱动程序。
MongoDB 中的 text search 功能(截至 2.6)没有任何内置的 fuzzy/partial 字符串匹配功能。正如您所指出的,该用例目前侧重于使用基本布尔运算符和 word/phrase 匹配的语言和词干支持。
根据您的要求以及您希望如何限定“高效”(速度、存储、开发人员时间、所需的基础设施等),有几种可能的模糊匹配方法可供考虑:
使用一些现成的相似和相似算法在您的应用程序逻辑中实现对 fuzzy/partial 匹配的支持。这种方法的好处包括不必添加任何额外的基础设施,并且能够根据您的要求密切调整匹配。
有关更详细的示例,请参阅:Efficient Techniques for Fuzzy and Partial matching in MongoDB。
与提供更高级搜索功能的外部搜索工具集成。这给您的部署增加了一些复杂性,并且可能只是为了提前输入而过度杀伤力,但您可能会发现其他搜索功能,您希望将其合并到您的应用程序的其他地方(例如,“like this”、词邻近度、分面搜索,..)。
例如见:How to Perform Fuzzy-Matching with Mongo Connector and Elastic Search. Note: ElasticSearch's fuzzy query是基于Levenshtein距离。
使用类似 Twitter 开源的自动完成库 typeahead.js
, which includes a suggestion engine and query/caching API. Typeahead is actually complementary to any of the other backend approaches, and its (optional) suggestion engine Bloodhound 支持预取以及在本地存储中缓存数据。
最好的情况是使用 elasticsearch 模糊查询:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html
它支持开箱即用的 levenshtein 距离算法,并具有可满足您的要求的其他功能,即:
- 更像这样
- 强大的方面/聚合
- 自动完成
我正在尝试使用 mongo 数据库为我的食谱网站实施搜索引擎。 我正在尝试在预先输入的小部件框中向用户显示搜索建议。
我什至试图支持拼写错误的查询(levenshtein 距离)。
例如:每当用户输入 'pza' 时,输入提示应显示 'pizza' 作为建议之一。
如何使用 mongodb 实现此类功能?
请注意,搜索应该是即时的,因为搜索结果将由预先输入的小部件获取。我要 运行 搜索查询的集合最多有 100 万个条目。
我想过实现 levenshtein 距离算法,但这会降低性能,因为集合很大。
我读了mongo中的FTS(Full Text Search) 2.6现在很稳定,但我的要求是近似匹配,而不是FTS。 FTS 不会 return 'pza' 'pizza'.
请推荐我有效的方法。
我正在使用节点 js mongodb 本机驱动程序。
MongoDB 中的 text search 功能(截至 2.6)没有任何内置的 fuzzy/partial 字符串匹配功能。正如您所指出的,该用例目前侧重于使用基本布尔运算符和 word/phrase 匹配的语言和词干支持。
根据您的要求以及您希望如何限定“高效”(速度、存储、开发人员时间、所需的基础设施等),有几种可能的模糊匹配方法可供考虑:
使用一些现成的相似和相似算法在您的应用程序逻辑中实现对 fuzzy/partial 匹配的支持。这种方法的好处包括不必添加任何额外的基础设施,并且能够根据您的要求密切调整匹配。
有关更详细的示例,请参阅:Efficient Techniques for Fuzzy and Partial matching in MongoDB。
与提供更高级搜索功能的外部搜索工具集成。这给您的部署增加了一些复杂性,并且可能只是为了提前输入而过度杀伤力,但您可能会发现其他搜索功能,您希望将其合并到您的应用程序的其他地方(例如,“like this”、词邻近度、分面搜索,..)。
例如见:How to Perform Fuzzy-Matching with Mongo Connector and Elastic Search. Note: ElasticSearch's fuzzy query是基于Levenshtein距离。
使用类似 Twitter 开源的自动完成库
typeahead.js
, which includes a suggestion engine and query/caching API. Typeahead is actually complementary to any of the other backend approaches, and its (optional) suggestion engine Bloodhound 支持预取以及在本地存储中缓存数据。
最好的情况是使用 elasticsearch 模糊查询: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html
它支持开箱即用的 levenshtein 距离算法,并具有可满足您的要求的其他功能,即: - 更像这样 - 强大的方面/聚合 - 自动完成