我正在调查MongoDB中某个集合的更新缓慢。以前的同事已经为_id
字段选择了字符串类型,并将索引基于其他字符串字段。
现在,我了解到文本索引已被阻止,并且可以想象,当文档更新时,这可能会很繁重。_id
字段的内容也是UUID。现在,我还不完全了解词干的工作原理,但是猜测UUID(part1-part2-part3-part4-etc
)的每个部分都成为索引中的唯一条目,从而导致查询变慢。
有人可以解释如何处理包含UUID的文本吗?
加粗仅适用于text
index的字符串字段。不能更改默认text
索引的选项,并且_id
索引不能是_id
索引,因此词干不适用于此上下文。 text
值是索引中的单个条目,必须唯一。
现在,我还不完全了解词干的工作原理,但是猜测UUID(
_id
)的每个部分都成为索引中的唯一条目,导致查询变慢。
part1-part2-part3-part4-etc
使用特定于语言的试探法将单词还原为期望的词根形式。词干库具有典型的语言变形规则概念,但对有效的单词或语法没有任何了解。通常,在Stemming索引定义中包含UUID字段(或其他随机非语言字符串)是没有意义的。
MongoDB text
索引使用开源text
进行词干分析。
有人可以解释如何处理包含UUID的文本吗?
最佳方法是访问Snowball library,以准确了解它们的解析方式。但是,如果您想快速尝试使用不同语言的词干算法,也可以使用explain MongoDB $text
queries。
MongoDB $text
索引或online Snowball demo查询将把空格和大多数标点符号(包括连字符)视为单词定界符,因此text
将被分成5个terms。将阻止每个术语,并将忽略任何重复的术语。由随机字母或类似$text
的值组成的术语在词干启发法的意外匹配之外不会有根形式。
例如,用英语:
part1-part2-part3-part4-etc
结尾的单词通常是复数。如果您组成一个part1
之类的随机词,它将词干s
。part4s
结尾的单词通常不是复数,因此part4
将保持不变。 您可以通过解释文本搜索查询并查看ss
的术语来查看短语的用法。
使用part4ss
shell:
parsedTextQuery
我在您的示例UUID中添加了mongo
和> 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" : [ ]
}
。由于part4s
源自part4ss
(这已经是一个唯一的术语),您会发现我的查询仅找到6个术语而不是7个。