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

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

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

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

如下为译文:mongodb

介绍数据库

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

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

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

获取数据集post

这篇文章,咱们会来到一个流行的连接聚合网站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(翻译/红叶   责编/仲浩) 

相关文章
相关标签/搜索