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

问题描述 投票:0回答:1

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

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

有人可以解释如何处理包含UUID的文本吗?

mongodb uuid stemming
1个回答
0
投票

加粗仅适用于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个。

© www.soinside.com 2019 - 2024. All rights reserved.