MongoDB之文本搜索

MongoDB之文本搜索

简介

         文本搜索的作用,如果你是java工程师,那么应该知道apache全文搜索引擎Lucene框架以及Solr和Elastiscearch全文搜索引擎技术。MongoDB提供了类似的搜索功能,就是文本搜索。

MongoDB支持的细节

  1. 定义文本搜索需要的索引
  2. 在基本查询和聚合框架中使用文本搜索

文本类型索引

注意:

  1. 一个集合可以有任意多个普通的索引,但是文本索引只能有一个,但是它可以为任意多个字段创建索引。
  2. 索引名称问题,MongoDB的索引名称最长空间为123字节,如果创建的文本所有字段太多,为了避免长度问题,可以指定索引的名称。

MongoDB之文本搜索_第1张图片普通的索引创建的时候,key:value值只可以选择1或者-1表示索引的排序方向。创建文本搜索索引值为text。表示文本类型索引。

文本搜索查询的时候,使用$text。

MongoDB之文本搜索_第2张图片如图,给对于的索引字段指定权重,搜索的时候匹配的几率就会增大,如果不指定默认为1。另外为了避免索引的名称超出123字节,所有自定义了名称。

基本的文本搜索

 

$text定义查询为文本搜索。¥search参数定义搜索使用的字符串。这里不需要指定是那个字段,因为会在所有文本字段索引中查询包含actions的值的文档都会查询出来,第二个参数title:1表示只要返回title字段即可。

以上查询返回的结果如下:

如果使用以下的查询条件,返回的结果也是一样的:

至于为什么会返回一样的结果。因为传递MongoDB in Action的时候,MongoDB由于使用的是$text文本索引查询,会将该条件分解为MongoDB和Action,只要包含这2个信息就会返回。不好意思,由于MongoDB目前不支持自定义分词,所以中文会显得比较尴尬一些。目前Solr这些框架是支持自定义分词的。

复杂的文本搜索

单个指定的值必须要出现,怎么写查询条件呢?使用双引号括起来的信息必须出现。

多个指定指定的值必须都出现,怎么写查询条件呢?一样。Mongodb和second edition都必须出现。类似and查询条件。Mongodb不会区分大小写。

更复杂的搜索条件

如果有的信息使用文本搜索索引查询,查询到后还有其它查询条件,如何处理呢?和普通查询一样。

在使用了$text文本搜索后,还增加了status必须是MEAP的查询条件。

文本搜索分数

文本搜索分数有什么用?可以表示匹配程度,分数越高,表示匹配程度越高。可以根据分数排序显示,把分数高的排前面。

MongoDB之文本搜索_第3张图片

利用权重影响查询结果

前面介绍创建文本搜索索引的时候,使用到了weights权重,给对于的字段设置权重,那么查询到该字段后的结果分值将乘以对应的权重,提示分数值。

关注微信公众号(程序员小兔)不定期分享技术

你可能感兴趣的:(MongoDB)