搜尋

首頁  >  問答  >  主體

python - MongoDb startswith和全文索引问题

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

PHPzPHPz2767 天前864

全部回覆(1)我來回復

  • 怪我咯

    怪我咯2017-04-18 09:40:12

    如果有普通索引的情況下,前綴固定的查詢是可以用到索引的。但不知道你說的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這個字段,因為一個集合上面只能有一個全文索引。

    回覆
    0
  • 取消回覆