当前位置: 首页 > 知识库问答 >
问题:

MongoDB全文和部分文本搜索

东门翰
2023-03-14
  • 带有Mongoose的MongoDB(3.2.0)

收藏:

  • 用户
  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
    null

查询:

  • db.users.find({“$text”:{“$search”:“Leonel”}})=>找到
  • db.users.find({“$text”:{“$search”:“leonel”}})=>找到(搜索大小写敏感为false)
  • db.users.find({“$text”:{“$search”:“Leonäl”}})=>找到(使用diacriticSensitive搜索为false)
  • db.users.find({“$text”:{“$search”:“leone”}})=>找到(部分搜索)
  • 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
    null

共有1个答案

郗鹏
2023-03-14

与MongoDB 3.4一样,文本搜索功能的设计是为了支持对文本内容进行不区分大小写的搜索,并使用特定于语言的停顿词和词干规则。支持的语言的词干规则基于标准算法,这些算法通常处理普通动词和名词,但不知道专有名词。

对部分或模糊匹配没有明确的支持,但是产生类似结果的术语可能会像这样工作。例如:“taste”、“tastes”和“tasteful”都是“tast”的词干。尝试雪球词干演示页面来试验更多的词干和词干算法。

匹配的结果都是同一个单词“Leonel”的变体,只因大小写和变音符不同。除非“莱昂内尔”可以被你所选择的语言的规则限制为更短的东西,否则这些是唯一能匹配的变体类型。

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

  • John Page在MongoDB中实现模糊匹配和部分匹配的有效技术
  • James Tan的有效部分关键字搜索

有一个相关的改进请求,您可以在MongoDB问题跟踪器中观察/更新:server-15090:改进文本索引以支持部分词匹配。

 类似资料:
  • 由于使用mongodb全文搜索不可能通过“蓝”这个词找到“蓝莓”,所以我想帮助我的用户完成“蓝”到“蓝莓”这个词。要这样做,是否可以查询mongodb全文索引->中的所有单词,我可以使用这些单词作为建议,即用于typeahead.js?

  • 问题内容: 我们计划在MongoDB中存储数百万个文档,因此非常需要全文搜索。我读过Elasticsearch和Solr是全文搜索的最佳可用解决方案。 Elastic搜索是否足够成熟,可以用于Mongodb全文搜索?我们还将分摊这些收藏。Elasticsearch是否适用于分片集合? 使用Elasticsearch或Solr有什么优缺点? MongoDB能够进行全文搜索吗? 问题答案: Mongo

  • 问题内容: MySQL全文搜索似乎是一种很棒的方法,也是使用SQL进行搜索的最佳方法。但是,我似乎停留在以下事实:它不会搜索部分单词。例如,如果我有一篇标题为“ MySQL Tutorial”的文章并搜索“ MySQL”,它将找不到它。 完成一些搜索后,我发现MySQL 4中提供了各种支持该功能的参考(我使用的是5.1.40)。我曾尝试使用“ MySQL ”和“%MySQL%”,但均无效(我发现一

  • 如果我搜索John,就会得到结果(如果我搜索Jo,就会得到event)。但如果我搜索无名氏,显然没有任何结果。 如果我将查询更改为JohnDoe,我会得到结果,但它会返回所有在其最后/名字中有John或Doe的人。 接下来是尝试使用mongoose TextSearch: 有办法解决吗? 没有外部插件的答案是首选的,但其他的也是希望的。

  • 我试图实现与linq文本搜索。我有一个用电子邮件数据填充的消息表。我想能够在消息体中搜索。然而,电子邮件正文很长,我想只显示搜索文本的一小部分,例如,如果我搜索: 奥特 在以下案文中: 知识产权是一种权利,是一种精英的权利,是劳动和财富的暂时性权利。但是,在最低限度上,我们需要一个实验室来进行日常工作。两人或两人在一个无教区的房间里互相指责。除偶尔因疏忽而死亡外,不得因疏忽而导致动物死亡。 结果应

  • 问题内容: 我正在将所有站点代码从使用mysql_ *函数转换为PDO。对于我的需求,PDO上的PHP文档尚不清楚。它为您提供了要使用的功能,但没有详细介绍它们在不同情况下的功能。 基本上,我有一个mysql全文搜索: 实际的语句要长得多,但这基本上就是它的作用。 我的问题是,如何将其纳入PDO? 我知道您不是要在位置标记周围使用引号,那么您是否将它们放在AGAINST()函数中?我包括他们吗?如