python - MongoDb startswith和全文索引问题
PHPz
PHPz 2017-04-18 09:38:12
0
1
888

场景是目前有个Mongo的collection中的name字段,name字段长度正常在4-10个中文左右,25W数据量。如果我用startswith匹配name查询的话性能会有怎样的压力呢?
如果给name字段加上全文索引又会有什么样的好处和坏处呢?

PHPz
PHPz

学习是最好的投资!

全部回覆(1)
刘奇

如果有普通索引的情況下,前綴固定的查詢是可以用到索引的。但不知道你說的startswith是什麼方法,如果是驅動裡面的,具體還要看是什麼驅動及它的文檔怎麼說。我所指的前綴固定是正規表示式以^開頭的匹配,例如:

db.collection.find({name: /^张/})

如果看一下執行計劃,是能看到IX_SCAN的:

db.collection.find({name: /^张/}).explain(true)

全文索引就是另一個東西了。簡單來說,可以不考慮前綴是否固定,但是全文索引的基本單位是不是字。所以下面這段話:

一師 是 個 好學校

搜尋的時候可以直接找你要的詞,例如:

db.collection.find({ $text: { $search: "好学校" } })

但是直接搜尋「校」很可能是搜不到的:

db.collection.find({ $text: { $search: "校" } })  // 无结果

當然這跟不同的分詞引擎怎麼分法有關,例子只是為說明全文索引的限制。
另外冠詞,量詞等沒有實際意義的詞也是會被過濾掉的,例如「個」:

db.collection.find({ $text: { $search: "个" } })  // 无结果

另外可能你也注意到了上面的查詢根本沒提到name這個字段,因為一個集合上面只能有一個全文索引。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板