我想创建一个自动完成输入框,在用户键入时显示单词建议。
基本上,我的问题是,当我使用$text操作符在文档中搜索字符串时,查询将只匹配完整的词干单词。这是出于相同的原因,如果文档字段包含单词blueberry,则搜索单词blue将不匹配文档。但是,搜索blueberry或blueberry将匹配。
find = {$text: { $search: 'blue' } };
^(与文档中的blueberry或bluebird不匹配。)
我希望能够做到这一点。我希望将'bluebruary'或'bluebird'与'blue'匹配,最初我认为这可以通过使用'starts with'(^)正则表达式来实现,但似乎$text和$search只接受字符串;而不是正则表达式。
我想知道是否有一种实现/维护起来不太复杂的方法来实现这一点。到目前为止,我只看到人们试图通过创建一个新的集合来实现这一点,并在带有文本索引的集合上运行map/reduce。
我不想使用ElasticSearch或Solr,因为我认为它对我正在尝试做的事情来说是矫枉过正的,尽管我有时认为最终我将没有其他选择,但我仍然不能相信没有一种更简单的方法来完成这一点。
2条答案
按热度按时间vuktfyat1#
MongoDB全文搜索只匹配整个单词,因此它本质上不适合自动完成。
$text运算符可以搜索单词和短语。查询将匹配完整的词干单词。例如,如果文档字段包含单词blueberry,则搜索单词blue将不匹配文档。但是,搜索blueberry或blueberry将匹配。
(来源:http://docs.mongodb.org/manual/core/index-text/)
huus2vyu2#
现在,你可以在MongoDB Atlas中使用Atlas Search来实现这一点。在使用autocomplete operator来进行查询之前,你必须先在索引定义中添加自动完成字段Map。这可以通过可视化编辑器或JSON编辑器来完成--有一个tutorial可以指导你如何实现它。
下面是来自文档的索引定义模板:
以及查询,您也可以在其中透过
fuzzy
参数指定支援输入错误容差: