Mongodb 是否可以指定Mongo文本搜索分隔符?

Mongodb 是否可以指定Mongo文本搜索分隔符?,mongodb,Mongodb,问题摘要 我希望从包含大约1000万条条目的集合中返回最匹配的Mongo文档。我在集合上有一个跨多个字段(firstName、lastName、id等)的文本索引。id的形式为#-#-#-#-### 我发现,当为这些id指定一个确切的短语时,${search:“'1-234-567”},我确实收到了正确的文档,但不是没有大约60秒以上的大性能影响。另一方面,如果删除搜索的连字符,${search:''1234567'},结果会立即返回 诊断 我相信这是因为Mongo用连字符分隔我的查询(即使这个

问题摘要

我希望从包含大约1000万条条目的集合中返回最匹配的Mongo文档。我在集合上有一个跨多个字段(firstName、lastName、id等)的文本索引。id的形式为
#-#-#-#-###

我发现,当为这些id指定一个确切的短语时,
${search:“'1-234-567”}
,我确实收到了正确的文档,但不是没有大约60秒以上的大性能影响。另一方面,如果删除搜索的连字符,
${search:''1234567'}
,结果会立即返回

诊断

我相信这是因为Mongo用连字符分隔我的查询(即使这个短语被引用),也许第二个过滤器确保我只得到一个精确的匹配。这似乎可以通过查询解释得到证明:

连字符搜索

非连字符搜索

请注意连字符搜索中的术语数组。我相信这将筛选匹配“1”、“234”、“567”的文档,然后最终为我提供正确的文档

潜在解决方案


我不能在这个字段上设置一个常规索引,因为搜索功能同样应该包含多个字段。我真正想做的是指定我不希望我的搜索字符串被标记化/分隔。可能吗?还有其他方法吗?

mongo中的文本索引使用分隔符,空格、连字符、破折号被视为分隔符。您可以从程序中处理它,并将查询中的正确文本传递给mongodb

用转义双引号将短语括起来:


db.testsearch.find({“$text”:{“$search”:“\”a@b\“”})

-也许可以尝试返回到旧版本的文本索引?我想知道是否有方法覆盖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" : [ ]
                        },
        ...
}