【问题标题】:Is it possible to specify Mongo text search delimiters?是否可以指定 Mongo 文本搜索分隔符?
【发布时间】: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”的文档,然后最终为我提供正确的文档。

可能的解决方案

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

【问题讨论】:

标签: mongodb


【解决方案1】:

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

https://books.google.com.sg/books?id=JkBPDwAAQBAJ&pg=PA155&lpg=PA155&dq=Tokenization+Delimiters%2Bmongodb&source=bl&ots=OXjjadWjMD&sig=ACfU3U1U02DeKS-Gchx92f-hJ0HErCdCzA&hl=en&sa=X&ved=2ahUKEwiHzo26s8rkAhUTgUsFHd2OAicQ6AEwDXoECAkQAQ#v=onepage&q=Tokenization%20Delimiters%2Bmongodb&f=false

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

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

【讨论】:

  • 我想知道是否有办法覆盖 Mongo 使用的分隔符 - 如果不是在索引上,至少对于查询。如上所述,将短语括在双引号中会返回到正确的文档,但查询时间比非分隔搜索要长得多,并且您可以在查询解释中看到,尽管有引号,它还是会分解术语。跨度>
猜你喜欢
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2015-06-16
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
相关资源
最近更新 更多