我如何创建一个自动完成MongoDB全文搜索

mzillmmw  于 2022-11-03  发布在  Go
关注(0)|答案(2)|浏览(106)

我想创建一个自动完成输入框,在用户键入时显示单词建议。
基本上,我的问题是,当我使用$text操作符在文档中搜索字符串时,查询将只匹配完整的词干单词。这是出于相同的原因,如果文档字段包含单词blueberry,则搜索单词blue将不匹配文档。但是,搜索blueberry或blueberry将匹配。

find = {$text: { $search:  'blue' } };

^(与文档中的blueberry或bluebird不匹配。)
我希望能够做到这一点。我希望将'bluebruary'或'bluebird'与'blue'匹配,最初我认为这可以通过使用'starts with'(^)正则表达式来实现,但似乎$text和$search只接受字符串;而不是正则表达式。
我想知道是否有一种实现/维护起来不太复杂的方法来实现这一点。到目前为止,我只看到人们试图通过创建一个新的集合来实现这一点,并在带有文本索引的集合上运行map/reduce。
我不想使用ElasticSearch或Solr,因为我认为它对我正在尝试做的事情来说是矫枉过正的,尽管我有时认为最终我将没有其他选择,但我仍然不能相信没有一种更简单的方法来完成这一点。

vuktfyat

vuktfyat1#

MongoDB全文搜索只匹配整个单词,因此它本质上不适合自动完成。
$text运算符可以搜索单词和短语。查询将匹配完整的词干单词。例如,如果文档字段包含单词blueberry,则搜索单词blue将不匹配文档。但是,搜索blueberry或blueberry将匹配。
(来源:http://docs.mongodb.org/manual/core/index-text/

huus2vyu

huus2vyu2#

现在,你可以在MongoDB Atlas中使用Atlas Search来实现这一点。在使用autocomplete operator来进行查询之前,你必须先在索引定义中添加自动完成字段Map。这可以通过可视化编辑器或JSON编辑器来完成--有一个tutorial可以指导你如何实现它。
下面是来自文档的索引定义模板:

{
  "mappings": {
    "dynamic": true|false,
    "fields": {
      "<field-name>": [
        {
          "type": "autocomplete",
          "analyzer": "lucene.standard",
          "tokenization": "edgeGram|rightEdgeGram|nGram",
          "minGrams": <2>,
          "maxGrams": <15>,
          "foldDiacritics": true|false
        }
      ]
    }
  }
}

以及查询,您也可以在其中透过fuzzy参数指定支援输入错误容差:

{
  $search: {
    "index": "<index name>", // optional, defaults to "default"
    "autocomplete": {
      "query": "<search-string>",
      "path": "<field-to-search>",
      "tokenOrder": "any|sequential",
      "fuzzy": <options>,
      "score": <options>
    }
  }
}

相关问题