我正在调查 MongoDB 中集合的缓慢更新。
以前的同事为_id
字段选择了字符串类型,并根据其他字符串字段建立索引。
现在我明白文本索引是有梗的,我可以想象更新文档时这可能会很重。-field
的内容_id
也是一个 UUID。现在我不完全理解词干是如何工作的,但是猜测 UUID ( part1-part2-part3-part4-etc
) 的每个部分成为索引中的唯一条目,导致查询变慢。
有人可以解释词干提取如何处理包含 UUID 的文本吗?
Stemming 仅适用于作为text
索引一部分的字符串字段。默认_id
索引的选项不能更改,_id
索引不能是text
索引,因此词干提取不适用于此上下文。该_id
值是索引中的单个条目,必须是唯一的。
现在我不完全理解词干是如何工作的,但是猜测 UUID (
part1-part2-part3-part4-etc
) 的每个部分成为索引中的唯一条目,导致查询变慢。
Stemming使用特定于语言的启发式方法将单词简化为它们预期的词根形式。词干库具有语言的典型屈折规则的概念,但对有效单词或语法没有任何理解。在text
索引定义中包含 UUID 字段(或其他随机的非语言字符串)通常没有意义。
MongoDBtext
索引使用开源Snowball 库进行词干提取。
有人可以解释词干提取如何处理包含 UUID 的文本吗?
最好的方法是解释 MongoDB$text
查询以准确了解它们是如何解析的。但是,还有一个在线 Snowball 演示,如果您想快速尝试不同语言的词干提取算法,它会很有用。
MongoDBtext
索引或$text
查询会将空格和大多数标点字符(包括连字符)视为单词分隔符,因此part1-part2-part3-part4-etc
将分为 5 个term。每个术语都将被截断,任何重复的术语都将被忽略。由随机字母或值组成的术语part1
不会有词干启发式意外匹配之外的根形式。
例如,在英语中:
s
一般是复数。如果你随便编一个单词 like part4s
,它就会干到part4
。ss
通常不是复数,因此part4ss
将保持不变。您可以通过解释文本搜索查询并查看parsedTextQuery
.
使用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" : [ ]
}
我在您的示例 UUID 中添加了part4s
和part4ss
。由于part4s
词干到part4
(这已经是一个独特的术语),您会注意到我的查询仅找到 6 个术语而不是 7 个。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句