几个字母查询时,有些文档没有出现在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。
我有一个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。