2014-01-09 103 views
23

因为它是不可能通过单词“蓝色”通过使用MongoDB的全文搜索,找到“蓝莓”,我想帮助我的用户完成单词“蓝色”来“蓝莓”。为此,是否可以查询mongodb全文索引中的所有单词 - >我可以使用这些单词作为建议,即typeahead.js?MongoDB的全文搜索+解决方法部分字词匹配

+0

我不相信这是现在,你可能能够使用查询条件,但我相信他们没有得分:http://docs.mongodb.org/manual/reference/command/text/#search -with-additional-query-conditions – Sammaye

+0

谁说在MongoDB中不可能部分匹配字符串? http://stackoverflow.com/questions/3305561/how-to-query-mongodb-with-like –

+5

@DenizZoeteman我不确定你是否理解这个问题,这是关于FTS不是一般查询 – Sammaye

回答

12

在文本搜索Language stemming使用一种算法来尝试涉及从一个共同的基衍生词(例如,“运行”应匹配“运行”)。这与您要为自动完成功能实现的前缀匹配(例如,“蓝色”匹配“蓝莓”)不同。

为了最有效地使用typeahead.js用MongoDB的文本搜索,我建议着重于prefetch支持预输入:

  • 创建中使用的keywords收集它具有常用词(也许使用频率计数)的采集。您可以通过running a Map/Reduce在您拥有文本搜索索引的集合中创建此集合,并在添加新文档时使用定期Incremental Map/Reduce保持文字列表处于最新状态。

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

然后,您可以使用客户端自动完成所产生的关键字JSON与预输入的prefetch功能:

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

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

+0

这是我想要的更多努力有一个整洁的想法! thx – KIC

1

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

1

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

根据您的集合的大小和多少RAM你有可用的,你可以通过$正则表达式搜索,通过建立适当的索引。 E.g:

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

如下您需要的指数:

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

这可能是非常快,如果你有足够的内存。

希望这会有所帮助。

+0

如果您不想从文本开始搜索,则索引将不会被使用。这种情况下的索引只是浪费资源。 – Skarllot

3

简单的解决方法我现在正在做的是打破文本保存为文本索引阵列个别字符。

然后当你做$search查询,你只需再次打破了查询到字符。

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

+0

downvote的原因? – Chen

1

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

相关问题