MongoDB 全文和部分文本搜索

标签 mongodb mongodb-query aggregation-framework spring-data-mongodb full-text-indexing

环境:

  • 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”词干化为更短的词,否则这些是唯一可以匹配的变体类型。

如果您想进行有效的部分匹配,则需要采用不同的方法。有关一些有用的想法,请参阅:

您可以在 MongoDB 问题跟踪器中观看/点赞一个相关的改进请求:SERVER-15090: Improve Text Indexes to support partial word match .

关于MongoDB 全文和部分文本搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44833817/

相关文章:

MongoDB - 使用多个参数从多个集合中搜索

mongodb - 如何在字段名称中使用点?

mongodb - 将新验证器添加到现有集合

javascript - 如何设置一个字段等于postId [METEOR]

php - Mongo Map Reduce 第一次

javascript - MongoDB 查询超过 30 秒的文档

node.js - mongoose findByIdAndUpdate 仅更新文档中的一个字段

node.js - 查找后在对象数组中设置字段。蒙古数据库

MongoDB $in 里面 $cond

MongoDB 以并行阶段展开或组合