几个字母查询时,有些文档没有出现在atlas-search中

Some documents not appear in atlas-search when query by few letters

我有一个collection。文档结构是,

{
  model: {
    name: 'string name'
  }
}

我启用了 atlas 搜索,还为 model.name 字段创建了一个 搜索索引。搜索工作正常,但唯一的问题是无法获得非常少的查询字母的结果

示例:

我有一个文件,

{
  model: {
     name: "space1duplicate"
  }
}

如果我查询 space,我 无法 得到结果。

{
  index: 'search_index',
  compound: {
    must: [
      {
        text: {
          query: 'space',
          path: 'model.name'
        }
      }
    ]
  }
}

但是如果我查询space1duplica,结果是returns

Atlas 搜索使用 Lucene 来完成这项工作。 mongodb 站点上的文档主要集中在 mongo 将查询传递给 Lucene 的特定语法,如果您不熟悉它的查询语言,可能会有点混乱。

首先,有许多分词器和分析器可用,每个都有特定的用途。当您询问有关图集搜索的问题时,您确实需要包含索引定义。

默认分词器使用单词分隔符构建索引,然后删除词尾以存储词干,同样取决于语言,默认为英语。

因此,为了通过单词的开头找到“space1duplicate”,您可以使用带有 nGram 标记的“自动完成”分析器。索引应按如下方式创建:

{
  "mappings": {
    "dynamic": false,
    "fields": {
      "name": {
        "tokenization": "nGram",
        "type": "autocomplete"
      }
    }
  },
  "storedSource": {
    "include": [
      "name"
    ]
  }
}

一旦它被索引(你可能需要稍等,你有更大的数据集),你可以通过以下搜索找到该文档:

{
  index: 'search_index',
  compound: {
    must: [
      {
        autocomplete: {
          query: 'spa',
          path: 'name'
        }
      }
    ]
  }
}

在索引期间,全文搜索引擎通过将文本拆分为可搜索的块来标记输入。查看 documentation.

中的相关部分

默认情况下,Atlas Search 不会按数字拆分单词,但如果您需要,请尝试使用 regex tokenizer 定义自定义分析器并将其用于您的字段:

{
  "mappings": {
    "dynamic": false,
    "fields": {
      "name": [
        {
          "analyzer": "digitSplitter",
          "type": "string"
        }
      ]
    }
  },
  "analyzers": [
    {
      "charFilters": [],
      "name": "digitSplitter",
      "tokenFilters": [],
      "tokenizer": {
        "pattern": "[0-9]+",
        "type": "regexSplit"
      }
    }
  ]
}

另请注意,如果需要,您可以对字符串字段使用 multiple analyzers