Maison > Questions et réponses > le corps du texte
场景是目前有个Mongo的collection中的name字段,name字段长度正常在4-10个中文左右,25W数据量。如果我用startswith匹配name查询的话性能会有怎样的压力呢?
如果给name字段加上全文索引又会有什么样的好处和坏处呢?
怪我咯2017-04-18 09:40:12
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.