我正在调查MongoDB中某个集合的更新缓慢。
前同事已经为_id
字段选择了字符串类型,并将索引基于其他字符串字段。
现在,我了解到文本索引是干的了,我可以想象在文档更新时这会变得很繁琐。
_id
字段的内容也是UUID。现在,我还不完全了解词干的工作原理,但是猜测UUID(part1-part2-part3-part4-etc
)的每个部分都会成为索引中的唯一条目,从而导致查询变慢。
有人可以解释如何在包含UUID的文本上执行词干处理吗?
答案 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中添加了part4s
和part4ss
。由于part4s
源自part4
(这已经是一个唯一的术语),您会发现我的查询仅找到6个而不是7个。