MongoDB之文本搜索
简介
文本搜索的作用,如果你是java工程师,那么应该知道apache全文搜索引擎Lucene框架以及Solr和Elastiscearch全文搜索引擎技术。MongoDB提供了类似的搜索功能,就是文本搜索。
MongoDB支持的细节
- 定义文本搜索需要的索引
- 在基本查询和聚合框架中使用文本搜索
文本类型索引
注意:
- 一个集合可以有任意多个普通的索引,但是文本索引只能有一个,但是它可以为任意多个字段创建索引。
- 索引名称问题,MongoDB的索引名称最长空间为123字节,如果创建的文本所有字段太多,为了避免长度问题,可以指定索引的名称。
普通的索引创建的时候,key:value值只可以选择1或者-1表示索引的排序方向。创建文本搜索索引值为text。表示文本类型索引。
文本搜索查询的时候,使用$text。
如图,给对于的索引字段指定权重,搜索的时候匹配的几率就会增大,如果不指定默认为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的查询条件。
文本搜索分数
文本搜索分数有什么用?可以表示匹配程度,分数越高,表示匹配程度越高。可以根据分数排序显示,把分数高的排前面。
利用权重影响查询结果
前面介绍创建文本搜索索引的时候,使用到了weights权重,给对于的字段设置权重,那么查询到该字段后的结果分值将乘以对应的权重,提示分数值。
关注微信公众号(程序员小兔)不定期分享技术