使用Mongo Connector和Elasticsearch实现模糊匹配

【编者按】本篇博文作者Luke Lovett是MongoDB公司的Java工程师,他展示了Mongo Connector经过2年发展后的蜕变——完成连接器两端的同步更新。期间,Luke还展示如何通过Elasticsearch实现模糊匹配。

以下为译文:

介绍

假设你正在运行MongoDB。太好了,现在已经可以为基于数据库的所有查询进行精确匹配了。现在,设想你正要在你的应用中建立一个文本搜索功能,它必须去除拼写错误这个噪音,最终可能会得到一个相近的结果。为此,这个令人生畏的任务,你需要在Lucene、Elasticsearch和Solr里选择一个。但是现在你面临这样一个问题——这些搜索工具将如何查询存储于MongoDB中的文档?以及你如何保持搜索引擎内容是最新的?

Mongo Connector填补了MongoDB和一些最好搜索工具(例如:Elasticsearch和Solr)之间的空白。这不仅是可以支撑从MongoDB副本集或这些系统分片集群中导出数据,而且可以保持这些系统之间的一致性:如果你在MongoDB中插入、更新和删除文件,那么这些改变会很快的通过Mongo Connector在另一端体现。你甚至可以使用Mongo Connector将操作以流的方式传送给其他关联副本集,从而模拟出一个“multi-master”集群。

Mongo Connector在2012年8月发布时,那个时候它的功能简单并缺少容错性。我从2013年11月开始使用Mongo连接器,期间得到了MongoDB Python团队的帮助,我非常兴奋地说它的功能和稳定性已经取得了很大进步。这篇文章将介绍这些新功能,以及如何使用Mongo Connector将MongoDB操作同步到Elasticsearch(一个开源的搜索引擎)中。在这篇文章的结尾,我们还展示如何对流入Elasticsearch中的数据实现文本查询的模糊匹配。

获取数据集

这篇文章,我们会来到一个流行的链接聚合网站Reddit。我们最近添加了一个由MongoDB提供支持的数据类型安全码,可以很好地处理外部数据库驱动器。这使得那些并没有得到充分控制的副本文档得以保证其安全性。使用下面这个脚本来传输Reddit新发布的post,使用流的方式将新生成的Reddit post传输到MongoDB中。

由于post是经过处理的,你应该能看到标题的前20个字。这个过程会模仿你开发应用时的操作,将数据写入MongoDB。

启动Mongo Connector

下一步,我们将启动Mongo Connector。为了下载和安装Mongo Connector,你可以使用pip:

为了示例的正常进行,我们假设你已经安装好了Elasticsearch,且运行于端口为9200的本地机器。你可以使用下面的命令从 MongoDB 复制到Elasticsearch。

当然,如果只想在post标题和内容中进行文本搜索,我们可以使用Elasticsearch的字段选项来限制字段。通过这个方法,我们能最小化所复制的数据量:

就像你看到reddit2mongo将Reddit post以STDOUT输出,你同样可以看到从Mongo Connector输出的日志——所有文档都在同时发送给了ES。

弹性的搜索

现在,我们准备使用Elasticsearch在我们的数据集上实现模糊匹配查询,因为它来自于MongoDB。由于我们直接从Reddit的网站输出内容,因此根本无法预测从数据集中获得的结果。以“kitten”的搜索为例,以下为实现代码:

由于我们正在进行一个模糊搜索,我们甚至可以搜索一个并不存在的词,例如kiten。由于大多数人根本不注重他们的拼写,它可以直接实现搜索用户随意输入的文本,至此,你可以想象这个功能是多么地强大。以下为实现代码:

模糊参数决定了下一次查询字段匹配的最大“edit distance”, prefix_length参数则需求结果必须匹配查询的第一个字母。这篇 文章详细说明了这个功能的实现途径,输出了和正确拼写同样的结果。

不仅是插入

尽管我们只演示了如何利用从 MongoDB 到Elasticsearch的连续文件流,但是Mongo Connector不仅仅是一个输入/输出工具。当你更新或删除MongoDB中的文件时,那些操作也会被记录在其他的系统中,保持与当下的主节点同步。如果主节点在做故障转移并产生一个回滚,Mongo Connector能删除操作并采取正确的做法来维持一致性。

总结

这个事情的真正意义在于我们在MongoDB和Elasticsearch里可以同时操作。若没有一个类似Mongo Connector的工具,我们不得不使用一个类似mongoexport工具去定期地从MongoDB转储数据至JSON,然后再上传这些数据至一个闲置的Elasticsearch中,导致我们空闲时无法提前删除文件。这大概是一件很麻烦的事,同时失去了Elasticsearch的近实时查询能力。

尽管Mongo Connector自第一次发布后有了长足的改进,但它仍然是一个实验性的产品,且没有MongoDB的官方支持。然而,我会一直致力于回答各方问题、总结功能请求,并在Github Mongo Connector页面上提交Bug报告,也会检查Github百科页关于Mongo Connector的所有文档。

原文:How to Perform Fuzzy-Matching with Mongo Connector and ElasticSearch

(翻译/红叶   责编/仲浩)

本文分享自微信公众号 - CSDN技术头条(CSDN_Tech)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2014-09-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

个人情报收集系统浅谈

*文章原创作者: ArthurKiller,转载请注明来自FreeBuf(FreeBuf.COM) 前言 IT的全称为information technolog...

39170
来自专栏take time, save time

三十天学不会TCP,UDP/IP网络编程 - RST的用法

不知不觉也写了这么多了,继续我的自己的推广大业~完整版可以去gitbook(https://www.gitbook.com/@rogerzhu/)看到。 如果对...

36470
来自专栏FreeBuf

挖洞经验 | 看我如何挖掘成人网站YouPorn的XSS并成功利用

事情开始变得有趣起来,使我不得不停下手中的工作。我很惊讶,这个问题之前竟然没有人能发现它。搜做表单中的XSS是最基本的情况之一,我和我的朋友都经常逛YouPor...

29550
来自专栏智能计算时代

深入浅出DDoS攻击防御

敌情篇 ——DDoS攻击原理 DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的 主要目的是让指定目标无法提供正常服务...

1.3K50
来自专栏静下来

Discuz论坛多功能工具1.0版本发布

Discuz论坛多功能工具(Summer版本)1.0发布。 软件是集合了之前单独工具的功能,增加了发帖的功能,这样也会更加方便点吧。但是没有进过大批量的测试,可...

46940
来自专栏张高兴的博客

网络唤醒(WOL)全解指南:原理篇

网络唤醒(Wake-on-LAN,WOL)是一种计算机局域网唤醒技术,使局域网内处于关机或休眠状态的计算机,将状态转换成引导(Boot Loader)或运行状态...

39510
来自专栏ytkah

公众号临时预览链接转永久链接怎么操作

  微信公众平台在六月份进行了一次更新升级,预览链接无法永久存在,只能作为临时预览使用,而且预览的链接将会在短期内失效+预览人数超过500人自动失效。那么利用素...

1.2K60
来自专栏女程序员的日常

M41T11-RTC(实时时钟)

一、理论准备 1. 主要器件:STM8单片机、M41T11时钟IC、32.768kHz晶振等。 2. 外围设备:烧录工具ST-Link/v2、串口、5v供电SA...

22510
来自专栏Android源码框架分析

Android wifi上网跟4G上网的区别

手机上网可以用Wifi,也可以用4G,这两者究竟有什么区别,Wifi模块跟4G无限通信模块用的是同一种上网媒介吗,一个4G手机是否两块网卡呢?手机的MAC地址说...

23850
来自专栏皮振伟的专栏

[linux][network]net bridge技术分析

前言: 对于作者这种没有在通信设备方面工作经验的人来说,理解网桥还是挺困难的。 二层之上的数据处理,协议分层,都是相对容易一些(尽管TCP协议复杂的一塌糊涂),...

770140

扫码关注云+社区

领取腾讯云代金券