【发布时间】:2020-01-13 17:09:40
【问题描述】:
问题概要
我希望从包含大约 1000 万个条目的集合中返回最匹配的 Mongo 文档。我在集合上有一个跨越多个字段(firstName、lastName、id 等)的文本索引。 id 采用#-###-### 的形式。
我发现,当为这些 id 指定一个确切的短语 ${search: '"1-234-567"'} 时,我确实收到了正确的文档,但并非没有大约 60 多秒的性能损失。另一方面,如果我删除搜索的连字符${search: '"1234567"'},结果会立即返回。
诊断
我相信这是因为 Mongo 用连字符分隔我的查询(即使该短语被引用),也许第二个过滤器确保我只得到完全匹配。查询解释似乎证明了这一点:
连字符搜索
db.person.find({$text: {$search: '"1-234-567"'}}, { score: { $meta: "textScore" } }).limit(1).sort({ score: { $meta: "textScore" } }).explain()
{
...
"indexName" : "Person_TextIndex",
"parsedTextQuery" : {
"terms" : [
"1",
"234",
"567"
],
"negatedTerms" : [ ],
"phrases" : [
"1-234-567"
],
"negatedPhrases" : [ ]
},
...
}
非连字符搜索
db.person.find({$text: {$search: '"1234567"'}}, { score: { $meta: "textScore" } }).limit(1).sort({ score: { $meta: "textScore" } }).explain()
{
...
"indexName" : "Person_TextIndex",
"parsedTextQuery" : {
"terms" : [
"1234567"
],
"negatedTerms" : [ ],
"phrases" : [
"1234567"
],
"negatedPhrases" : [ ]
},
...
}
请注意连字符搜索中的术语数组。我相信这将筛选匹配“1”、“234”、“567”的文档,然后最终为我提供正确的文档。
可能的解决方案
我真的不能在这个字段上放置一个常规索引,因为搜索功能又应该包含多个字段。我真正想做的是指定我不希望我的搜索字符串被标记/分隔。那可能吗?还有其他方法吗?
【问题讨论】:
-
It does look like this has something to do with the text indexes - 也许尝试回退到旧版本的文本索引?
-
@Bill 我们遇到了同样的事情,你找到解决方案了吗?
标签: mongodb