MongoDB全文搜索策略

13
我们正试图开发一种使用elasticsearch进行mongodb全文搜索的策略。似乎我们想要用作过滤器的每个键都必须包含在弹性索引中。潜在地,我们可能想要使用mongo中的每个键作为过滤器,即通过描述进行全文搜索,按日期和电话号码进行过滤。有没有人有添加全文到mongo的真实经验可以分享?
也许我们可以只使用elasticsearch作为数据库?
2个回答

14
我认为没有必要将ElasticSearch与MongoDb结合使用,只需将ElasticSearch作为需要搜索的文档的单独文档存储。是的,你甚至可以将整个数据库存储在ElasticSearch中。当然,这取决于你的领域模型和其他因素。
如果不需要词干处理、模糊搜索、复杂的通配符搜索,则可以使用MongoDb进行搜索。当插入新文档时,将其拆分为小写单词,并添加到例如“words”的数组中。稍后,您可以针对此数组执行带有regex的搜索请求。您可以在此正则表达式中使用I(忽略大小写)选项,而且您仅能搜索LIKE%通配符(或不使用通配符)。否则,搜索将不使用MongoDb索引。
另一个选择是,如果您正在使用Java,则可以尝试使用Lucene。可能你能够扩展Directory类,以使Lucene将索引存储在MongoDb中,而不是文件系统或RAM中。我还没有在这个领域做过任何研究,但我认为这是可能的。
最后,提供了另一种选择 - 尝试为MongoDb找到river

谢谢Umar,我们将尝试您的方法。 - stew
虽然这是一个选项,但是当数据量足够大时,正则表达式搜索变得效率低下。这实际上就是搜索索引器存在的原因。它们为保持昂贵的搜索操作远离数据库而补充和增强了持久存储。 - Joe Mills
即使使用正则表达式,MongodDb也可以像我在答案中提到的那样使用索引,这取决于正则表达式的类型。 - Anton

9
我按照@Umar的建议,在MongoDB中尝试使用全文搜索,通过分割字符串中的单词实现。但实际上,它只是一个数据库,不是搜索引擎,因此我建议将Mongo用于持久存储,将ElasticSearch用于搜索引擎部分。事实上,我会选择像PostgreSQL这样的数据库进行持久存储,然后将要搜索的数据推送到搜索引擎中。您可以使用http://gdal.org/ogr/drv_elasticsearch.html 驱动程序,快速将数据从一个RDBMS导出到ElasticSearch。只要有一种连接到输入源的方法,数据就不必是地理空间数据即可使用GDAL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接