Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >mongodb近似字符串匹配

mongodb近似字符串匹配
EN

Stack Overflow用户
提问于 2015-01-16 05:01:27
回答 2查看 18.7K关注 0票数 24

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

我甚至尝试支持拼写错误的查询(Levenshtein distance)。

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

如何使用mongodb实现这样的功能?

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

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

我在mongo 2.6中读到的FTS (全文搜索)现在非常稳定,但我的要求是近似匹配,而不是FTS。FTS不会将“pza”返回为“pza”。

请给我推荐一下有效的方法。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-16 12:31:23

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的fuzzy query是基于Levenshtein距离的。

  • 使用像Twitter的开源typeahead.js这样的自动补全库,它包括一个建议引擎和查询/缓存API。Typeahead实际上是对任何其他后端方法的补充,它的(可选)建议引擎Bloodhound支持在本地存储中预取和缓存数据。
票数 20
EN

Stack Overflow用户

发布于 2016-03-01 11:38:24

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

它支持开箱即用的levenshtein距离算法,并具有对您的需求有用的附加功能,例如:-更像这样-功能强大的方面/聚合-自动完成

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27977575

复制
相关文章
elasticsearch深入搜索一之近似匹配
1. 从上面几种分词器的对比中可以看出,拼音分词器主要是把中文转换成拼音的方式进行分词; 2. ik_max_word分词和ik_smart分词器主要是索引单词而不是索引独立的单词; 3. standard分词器主要是索引独立的单词而不对词项进行索引。
山行AI
2019/06/28
2.7K0
mongodb 字符串查找匹配中$regex的用法
官网地址:https://docs.mongodb.com/manual/reference/operator/query/regex/#regex-case-insensitive
庞小明
2018/12/10
6.2K0
字符串匹配算法_多字符串匹配
从好后缀的后缀子串中,找一个最长的且和模式串的前缀子串匹配的 {v},滑动至 {v} 对齐
全栈程序员站长
2022/09/25
1.8K0
字符串匹配算法_多字符串匹配
字符串的匹配算法_多字符串匹配
不要被事物的表面现象所迷惑,这个算法全称:Brute Force,有个拉风的中文名:暴力匹配算法。
全栈程序员站长
2022/09/25
2.3K0
字符串的匹配算法_多字符串匹配
Java字符串匹配_正则匹配替换字符串
public static void main(String args[]) {
全栈程序员站长
2022/09/24
2.6K0
字符串匹配
问题描述 试题编号: 201409-3 试题名称: 字符串匹配 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。 输入格式   输入的第一行包含一个字符串S,由大小写英文字母组成。   第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。   第三行包含一个整数n,表示给出的文字的行数。   接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。 输出格式   输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。 样例输入 Hello 1 5 HelloWorld HiHiHelloHiHi GrepIsAGreatTool HELLO HELLOisNOTHello 样例输出 HelloWorld HiHiHelloHiHi HELLOisNOTHello 样例说明   在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。 评测用例规模与约定   1<=n<=100,每个字符串的长度不超过100。
geekfly
2022/05/06
8440
[算法系列之十二]字符串匹配之蛮力匹配
字符串匹配是数据库开发和文字处理软件的关键。幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作。不过理解他们的原理还是比较重要的。
全栈程序员站长
2022/09/24
1.7K0
[算法系列之十二]字符串匹配之蛮力匹配
字符串匹配算法 -- 朴素匹配
为什么叫做朴素匹配,我理解的就是这是一种寻常想法,简单粗暴的算法。是一种暴力的算法,不考虑其时间复杂度以及效率。只要达到匹配的目的即可。
lexingsen
2022/02/24
1.9K0
字符串匹配算法 -- 朴素匹配
字符串匹配算法_字符串模式匹配算法
网络信息中充满大量的字符串,对信息的搜寻至关重要,因此子字符串查找(即字符串匹配)是使用频率非常高的操作:给定一段长度为N的文本和长度为M的模式字符串(N≥M),在文本中找到一个和模式串相匹配的子串。由这个问题可以延伸至统计模式串在文本中出现的次数、找出上下文(和该模式串相符的子字符串周围的文字)等更复杂的问题。
全栈程序员站长
2022/08/02
2.9K0
字符串匹配算法_字符串模式匹配算法
字符串 模式匹配
本文介绍了什么是程序员的内功——算法以及其重要性。算法是程序的核心,它能够高效地解决问题。文章通过一些例子详细讲解了算法的概念和其具体实现,并探讨了算法对于程序员的职业发展以及日常生活中的影响。
静默虚空
2018/01/05
1.5K0
字符串 模式匹配
【CCF】字符串匹配
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
1K0
bash字符串匹配
#!/bin/sh foo() {     local basedir=$1     local all_entries=`ls -c`     for entry in $all_entries     do           if test -d $entry; then             cd $entry&&foo ${basedir}/$entry;cd - >/dev/null         else             if [[ $entry
一见
2018/08/07
1.1K0
字符串匹配问题
、字符串匹配问题 【问题描述】        字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]), ([])都应该输出NO。 【输入格式】strs.in        文件的第一行为一个整数n,表示以下有多少个由括好组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。 【输出格式】strs.out        在输出文件中有N行,每行都是
attack
2018/04/12
1.6K0
KMP字符串匹配
假设我们有这样一个要求,一个字符串S,一个匹配字符串P,我们想知道匹配串P是否被包含在字符串S中,如果包含那它在S的什么位置上? 解决这个问题最简单的方法就是暴力匹配,匹配串中的一个元素匹配到了,就
一个架构师
2022/06/20
8660
KMP字符串匹配
c语言匹配字符串表达式函数_java字符串匹配
最近在写一个程序,需要用到字符串匹配,并且返回匹配的字符串,C语言库函数中的strtstr无法满足我的要求,只能自己写了。 代码如下
全栈程序员站长
2022/09/24
9980
字符串匹配算法详解
愿你们都能考上自己心仪的学校,为你们的备考生涯划上一个完美的句号。做为你们的师兄有几句话想对你们说,希望这些话能对你们有一些帮助。
公众号袁厨的算法小屋
2021/01/08
1.5K0
字符串匹配(一) -- 朴素匹配与 KMP 算法
软件算法中,最基础的算法要数排序和查找了,而字符串模式匹配算法可谓是基础中的基础,而最有名又最具代表性的字符串匹配算法要数 KMP 算法了,本文我们就来详细介绍一下 KMP 算法
用户3147702
2022/06/27
1.3K0
字符串匹配(一) -- 朴素匹配与 KMP 算法
Sunday 字符串匹配算法
这里我们看到O-S不相同,我们就看匹配串中的O在模式串的位置,没有出现在模式串中。
指点
2019/01/18
1.6K0
LeetCode - 增减字符串匹配
原题地址:https://leetcode-cn.com/problems/di-string-match/
晓痴
2019/07/30
6540
算法 | KMP字符串匹配
Python字符串str是在Python编写程序过程中,最常见的一种基本数据类型。字符串是许多单个子串组成的序列,其主要是用来表示文本。字符串是不可变数据类型,也就是说你要改变原字符串内的元素,只能是新建另一个字符串。字符串匹配就是基于最简单的字符比较,其中的模式串就是普通字符串,所做匹配是在目标串里查找等于模式串的子串。也就是说,比较的一方是表示模式的字符串,另一方是目标字符串的所有可能子串。我们常用的就是朴素的串匹配算法和无回溯串匹配算法(KMP算法)。
算法与编程之美
2019/09/17
1.2K0
算法 | KMP字符串匹配

相似问题

使用MongoDB实现更高效的近似字符串匹配

32

近似字符串匹配

40

近似字符串匹配算法

78

LevenshteinSim()近似字符串匹配

11

近似字符串匹配防御

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档