原文来自于:http://www.csdn.net/article/2014-09-01/2821485-how-to-perform-fuzzy-matching-with-mongo-connector

 
摘要:短短两年,Mongo Connector取得了突破性的进展,用户已经可以通过它完成连接器两边的同步更新。而基于这个特性,其他工具针对MongoDB内存储文件的实时操作也成为可能。

【编者按】本篇博文作者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中。

./reddit2mongo --mongo-host localhost --mongo-port 27017

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

启动Mongo Connector

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

pip install mongo-connector

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

mongo-connector -m localhost:27017 -t localhost:9200 -d mongo_connector/doc_managers/elastic_doc_manager.py

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

mongo-connector -m localhost:27017 -t localhost:9200 --fields title,text -d mongo_connector/doc_managers/elastic_doc_manager.py

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

弹性的搜索

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

curl -XPOST ‘http://localhost:9200/reddit.posts/_search’ -d’{
"query": {
"match": {
"title": {
"query": "kitten",
"fuzziness": 2,
"prefix_length": 1
}
}
}
}’

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

curl -XPOST ‘http://localhost:9200/reddit.posts/_search’ -d’{
"query": {
"match": {
"title": {
"query": "kiten",
"fuzziness": 2,
"prefix_length": 1
}
}
}
}’

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

不仅是插入

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

总结

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

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

原文链接: How to Perform Fuzzy-Matching with Mongo Connector and ElasticSearch(翻译/红叶   责编/仲浩)

转:使用Mongo Connector和Elasticsearch实现模糊匹配的更多相关文章

  1. java使用elasticsearch进行模糊查询之must使用-项目中实际使用

    java使用elasticsearch进行多个条件模糊查询 文章说明: 1.本篇文章,本人会从java连接elasticsearch到查询结果生成并映射到具体实体类(涵盖分页功能) 2.代码背景:el ...

  2. java使用elasticsearch进行模糊查询-已在项目中实际应用

    java使用elasticsearch进行模糊查询 使用环境上篇文章本人已书写过,需要maven坐标,ES连接工具类的请看上一篇文章,以下是内容是笔者在真实项目中运用总结而产生,并写的是主要方法和思路 ...

  3. Mongo Connector for BI

    官网地址:https://www.mongodb.com/products/bi-connector 它目前包含两个组件: mongosqld:mongosqld接受来自SQL客户端的传入请求,并将这 ...

  4. es 基于match_phrase的模糊匹配原理及使用

    [版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 在业务中经常会遇到类似数据库的"like"的模糊匹配需求 ...

  5. 1035-Spell checker(模糊匹配)

    一,题意: 给出一组字典的单词,以'#'结束,之后给出一组要执行模糊匹配的单词序列,以'#'结束 1,若某个单词能在字典中找到,则输出corret 2,若某个单词能通过 变换 或 删除 或 添加一个字 ...

  6. sql模糊匹配中%、_的处理

    防sql注入之模糊匹配中%._处理: StringBuilder sbSql = new StringBuilder(); sbSql.Append(@"SELECT * from tabl ...

  7. 记一个同时支持模糊匹配和静态推导的Atom语法补全插件的开发过程: 序

    简介 过去的一周,都睡的很晚,终于做出了Atom上的APICloud语法提示与补全插件:apicloud_autocomplete.个中滋味,感觉还是有必要记录下来的.代码基于 GPL-3.0 开源, ...

  8. 茗洋Easy UI 1.3.2 部分问题解决系列专题[Combo模糊匹配中文问题 修复]

    本次给大家带来的EasyUI的我研究拓展的新特性 我使用的是  EasyUI 1.3.2版本的,项目是ASP.NET MVC3,但是本篇讲解用不上ASP.NET MVC,仅仅修改官方Demo你就知道怎 ...

  9. Mysql 模糊匹配和转义字符

    首先创建一个测试表: insert into test(tt) values('\\\\172.18.28.153'); 现在我想使用模糊匹配,查出以 “\\172” 开头的字符串. 需要使用like ...

随机推荐

  1. 2的32次方 分类: C#小技巧 2014-08-05 18:18 406人阅读 评论(0) 收藏

    版权声明:本文为博主原创文章,未经博主允许不得转载.

  2. 【Android - V】之SwipeRefreshLayout的使用

    SwipeRefreshLayout是Android V4.V7包中的一个控件,是Google给我们提供的一个下拉刷新的布局控件,可以轻松完成下拉刷新. SwipeRefreshLayout的特点是其 ...

  3. MongoDB 安装与启动

    一.MongoDB简单介绍 MongoDB是一个高性能,开源.无模式的文档型数据库.是当前NoSql数据库中比較热门的一种.它在很多场景下可用于替代传统的关系型数据库或键/值存储方式. Mongo使用 ...

  4. Bit data type

    mysql> create table t(a bit()); Query OK, rows affected (0.04 sec) mysql> insert into t '; Que ...

  5. linux innode图解2

    http://www.opsers.org/linux-home/base/the-knowledge-that-one-day-learn-linux-file-system.html 文件系统是操 ...

  6. 计算机体系结构 -内存优化vm+oom

    http://www.cnblogs.com/dkblog/archive/2011/09/06/2168721.htmlhttps://www.kernel.org/doc/Documentatio ...

  7. css考核点整理(四)-css盒模型

    http://paranimage.com/css-box-model/

  8. TFS 安装与管理

    整了几天TFS,把相关的一些配置与安装的要点简单记下,希望对大家有用.本篇主要是安装与配置上的内容,下一篇会介绍如何使用以及使用方面的相关心得体会. 本篇内容简要: 1.   安装部署 1.1.  流 ...

  9. EntityFramework 中生成的类加注释

    EF5在生成实体类时获取不到数据库中表的说明字段,需要使用单独的t4模板来获取 下载文件 将文件与edmx 放同一文件夹 1.在生成类的t4模板中加入 <#@ include file=&quo ...

  10. Oracle dblink的创建及使用

    在工作中遇到的情况简单说下: --首先要赋予用户创建dblink的权限.grant resource to ods_nwsc;grant create database link to ods_nws ...