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

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

PHPz
PHPz

学习是最好的投资!

répondre à tous(1)
刘奇

S'il existe un index commun, les requêtes avec un préfixe fixe peuvent utiliser l'index. Mais je ne sais pas ce qui commence par la méthode dont vous parlez. Si elle est dans le pilote, cela dépend du pilote et de ce que dit sa documentation. Le préfixe auquel je fais référence est la correspondance d'expressions régulières commençant par ^, telles que :

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

Si vous regardez le plan d'exécution, vous pouvez voir IX_SCAN :

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

L'index de texte intégral est une autre chose. En termes simples, vous n'avez pas besoin de vous demander si le préfixe est fixe, mais l'unité de base de l'index de texte intégral est , pas un mot. Donc le paragraphe suivant :

La Première Division est une bonne école

Lors de la recherche, vous pouvez trouver directement le mot souhaité, tel que :

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

Mais si vous recherchez directement « école », vous ne pourrez peut-être pas le trouver :

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

Bien sûr, cela est lié à la façon dont les différents moteurs de segmentation de mots sont divisés. L'exemple sert simplement à illustrer les limites de l'indexation de texte intégral.
De plus, les articles, quantificateurs et autres mots qui n'ont aucune signification réelle seront également filtrés, comme « personnalité » :

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

De plus, vous remarquerez peut-être également que la requête ci-dessus ne mentionne pas du tout le champ name, car il ne peut y avoir qu'un seul index de texte intégral sur une collection.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal