MongoDB全文搜索+部分单词匹配的解决方法

时间:2014-01-09 11:19:39

标签: mongodb full-text-search

由于使用mongodb全文搜索无法通过单词“blue”找到“blueberry”,我想帮助我的用户完成“blue”到“blueberry”这个词。为此,是否可以查询mongodb全文索引中的所有单词 - >我可以使用单词作为建议,即typeahead.js?

5 个答案:

答案 0 :(得分:12)

文本搜索中的

Language stemming使用算法来尝试关联从公共基础派生的单词(例如,“running”应该匹配“run”)。这与您要为自动完成功能实现的前缀匹配(例如“蓝色”匹配“蓝莓”)不同。

为了最有效地使用typeahead.js进行MongoDB文本搜索,我建议关注typeahead中的prefetch支持:

  • 创建一个keywords集合,其中包含您的集合中使用的常用字词(可能包含使用频率计数)。您可以在您拥有文本搜索索引的集合中通过running a Map/Reduce创建此集合,并在添加新文档时使用定期Incremental Map/Reduce使单词列表保持最新。

  • 让您的应用程序从keywords集合生成一个带有唯一关键字的JSON文档(可能仅限于基于字词频率的“热门”关键字,以保持列表可管理/相关)。

然后,您可以使用生成的关键字JSON进行客户端自动填充,并使用typeahead的prefetch功能:

$('.mysearch .typeahead').typeahead({
  name: 'mysearch',
  prefetch: '/data/keywords.json'
});

typeahead.js会将prefetch JSON数据缓存在localStorage中以进行客户端搜索。提交搜索表单后,您的应用程序可以使用服务器端MongoDB text search以相关顺序返回完整结果。

答案 1 :(得分:4)

我现在正在做的一个简单的解决方法是将文本分成存储为文本索引数组的单个字符。

然后,当您执行$search查询时,您只需将查询分解为字符。

请注意,这仅适用于长度小于32的短字符串,否则索引构建过程将花费很长时间,因此在插入新记录时性能会显着下降。

答案 2 :(得分:1)

您无法查询索引中的所有单词,但您当然可以查询原始文档的字段。搜索索引中的单词也不总是完整的单词,但无论如何都会被阻止。所以你可能不会在索引中找到“蓝莓”,而只是“blueberri”。

答案 3 :(得分:1)

不知道这对于面临这个问题的新人是否有用。

根据收藏的大小和可用的内存量,您可以通过$ regex进行搜索,方法是创建正确的索引。 E.g:

db.collection.find( {query : {$regex: /querywords/}}).sort({'criteria': -1}).limit(limit)

您需要一个索引如下:

db.collection.ensureIndex( { "query": 1, "criteria" : -1 } )

如果你有足够的记忆,这可能会非常快。

希望这有帮助。

答案 4 :(得分:1)

对于那些尚未开始实施任何数据库体系结构并且正在寻求解决方案的人,请访问Elasticsearch。它是一个json文档驱动的数据库,类似于mongodb结构。它具有“edge-ngram”分析器,它真的非常高效,快速地为您提供错误拼写搜索的意思。您也可以部分搜索。