环境:
- MongoDB (3.2.0) 与 Mongoose
收藏:
- 用户
文本索引创建:
BasicDBObject keys = new BasicDBObject();
keys.put("name","text");
BasicDBObject options = new BasicDBObject();
options.put("name", "userTextSearch");
options.put("unique", Boolean.FALSE);
options.put("background", Boolean.TRUE);
userCollection.createIndex(keys, options); // using MongoTemplate
文档:
- {"name":"LEONEL"}
查询:
db.users.find( { "$text": { "$search": "LEONEL"} } )
=> 找到db.users.find( { "$text": { "$search": "leonel"} } )
=> FOUND (search caseSensitive 为 false)db.users.find( { "$text": { "$search": "LEONÉL"} } )
=> FOUND(使用 diacriticSensitive 搜索为 false)db.users.find( { "$text": { "$search": "LEONE"} } )
=> FOUND(部分搜索)db.users.find( { "$text": { "$search": "LEO"} } )
=> 未找到(部分搜索)db.users.find( { "$text": { "$search": "L"} } )
=> 未找到(部分搜索)
知道为什么我使用查询“LEO”或“L”得到 0 个结果吗?
不允许带有文本索引搜索的正则表达式。
db.getCollection('users')
.find( { "$text" : { "$search" : "/LEO/i",
"$caseSensitive": false,
"$diacriticSensitive": false }} )
.count() // 0 results
db.getCollection('users')
.find( { "$text" : { "$search" : "LEO",
"$caseSensitive": false,
"$diacriticSensitive": false }} )
.count() // 0 results
MongoDB 文档:
最佳答案
在 MongoDB 3.4 中,text search该功能旨在支持使用特定于语言的停用词和词干规则对文本内容进行不区分大小写的搜索。 supported languages 的词干规则基于标准算法,通常处理常见动词和名词,但不知道专有名词。
没有明确支持部分匹配或模糊匹配,但源于相似结果的术语可能看起来是这样工作的。例如:“taste”、“tastes”和tasteful”都是“tast”的词干。尝试Snowball Stemming Demo页面尝试更多的词和词干算法。
您匹配的结果是同一个单词“LEONEL”的所有变体,并且仅因大小写和变音符号而异。除非您选择的语言规则可以将“LEONEL”词干化为更短的词,否则这些是唯一可以匹配的变体类型。
如果您想进行有效的部分匹配,则需要采用不同的方法。有关一些有用的想法,请参阅:
- Efficient Techniques for Fuzzy and Partial matching in MongoDB作者:约翰佩奇
- Efficient Partial Keyword Searches詹姆斯·谭
您可以在 MongoDB 问题跟踪器中观看/点赞一个相关的改进请求:SERVER-15090: Improve Text Indexes to support partial word match .
关于MongoDB 全文和部分文本搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44833817/