在MongoDB中,如果我的文本包含UUID,如何阻止文本?

时间:2019-12-20 08:20:09

标签: mongodb uuid stemming

我正在调查MongoDB中某个集合的更新缓慢。
前同事已经为_id字段选择了字符串类型,并将索引基于其他字符串字段。

现在,我了解到文本索引是干的了,我可以想象在文档更新时这会变得很繁琐。
_id字段的内容也是UUID。现在,我还不完全了解词干的工作原理,但是猜测UUID(part1-part2-part3-part4-etc)的每个部分都会成为索引中的唯一条目,从而导致查询变慢。

有人可以解释如何在包含UUID的文本上执行词干处理吗?

1 个答案:

答案 0 :(得分:0)

加粗仅适用于text index中的字符串字段。无法更改默认_id索引的选项,并且_id索引不能是text索引,因此词干不适用于此上下文。 _id值是索引中的单个条目,必须唯一。

  

现在我还不完全了解词干的工作原理,但是猜测UUID(part1-part2-part3-part4-etc)的每个部分都成为索引中的唯一条目,从而导致查询变慢。

Stemming使用特定于语言的试探法将单词还原为其预期的词根形式。词干库具有典型的语言变形规则概念,但对有效的单词或语法没有任何了解。在text索引定义中包含UUID字段(或其他随机非语言字符串)通常是没有意义的。

MongoDB text索引使用开源Snowball library进行阻止。

  

有人可以解释如何在包含UUID的文本上执行词干处理吗?

最好的方法是访问explain MongoDB $text queries,以准确了解它们的解析方式。但是,如果您想快速尝试针对不同语言的词干算法,那么还有一个online Snowball demo很有用。

MongoDB text索引或$text查询会将空格和大多数标点符号(包括连字符)视为单词定界符,因此part1-part2-part3-part4-etc将分为5个术语。将阻止每个术语,并将忽略任何重复的术语。由随机字母或类似part1的值组成的术语在词干启发法的意外匹配之外不会有根形式。

例如,英语:

  • 以单个s结尾的单词通常是复数。如果您组成一个part4s之类的随机词,它就会变成part4的词。
  • ss结尾的单词通常不是复数,因此part4ss将保持不变。

您可以通过解释文本搜索查询并查看parsedTextQuery的术语来了解短语的用法。

使用mongo shell:

> db.stores.createIndex( { name: "text", description: "text" } )
> db.stores.find( { $text: { $search: "part1-part2-part3-part4-etc-part4s-part4ss" } } ).
       explain().queryPlanner.winningPlan.parsedTextQuery
{
    "terms" : [
        "etc",
        "part1",
        "part2",
        "part3",
        "part4",
        "part4ss"
    ],
    "negatedTerms" : [ ],
    "phrases" : [ ],
    "negatedPhrases" : [ ]
}

我在您的示例UUID中添加了part4spart4ss。由于part4s源自part4(这已经是一个唯一的术语),您会发现我的查询仅找到6个而不是7个。