本篇博文主要介绍mongoDB中一些常用的特殊索引类型,主要包括:
用于简单字符串搜索的全文本索引;
用于球体空间(2dsphere)的地理空间索引
用于二维平面(2d)的地理空间索引。
一、全文索引
mongoDB有一个特殊的索引用在文档中搜索文本,之前的博客都是用精确匹配来查询字符串,这些技术有一定的限制。在搜索大块文本的速度非常慢,而且无法处理自然语言礼节的问题。全文本索引使用的是“倒排索引”的思想来做的,和当前非常开源的lucene(全文检索,Apacle基金会下的开源项目)项目是一样的思想来做的。使用全文本索引可以非常快的进行文本搜索,mongoDB支持多种语言,可惜在免费版中,并不支持世界第一的火星文语言(汉语)。查mongoDB的官网可以看到,在企业版中是支持汉语的全文索引的。
如果公司用的是免费版的mongoDB,而又需要用到中文的全文索引,建议使用lucene或者solr等开源项目来做。(没钱就得用技术来补,赤裸裸的现实。)
使用全文本检索需要专门开启这个功能才能进行使用。启动mongoDB时指定--setParameter textSearchEnabled=true选项,或者在运行时执行setParameter命令,都可以启用全文本索引。
准备10条数据:
一个集合上最多只能有一个全文本索引,但是全文本索引可以包含多个字段。全文索引与“普通”的多键索引不同,全文本索引中的字段顺序不重要:每个字段都被同等对待,可以为每个字段指定不同的权重来控制不同字段的相对重要性。
我们来给title和context字段建立全文本索引,给title字段2的权重,context字段1的权重。(权重的范围可以是1~1,000,000,000,默认权重是1)。
我们利用这个全文本索引来搜索一下。搜索的内容是“flotation”。
结果如下图所示:
二、2dsphere索引
点可以用形如[longitude,latitude]([经度,纬度])的两个元素的数组表示("loc"字段的名字可以是任意的,但是其中的子对象是有GeoJSON指定的,不能改变):
线可以用一个由点组成的数组来表示:
多边形的表示方式与线一样,但是“type”不同:
创建2dsphere索引:
地理空间查询的类型有三种:交集(intersection)、包含(within)、接近(nearness)。查询时,需要将希望查找的内容指定为形如{"$geometry":geoJsonDesc}的GeoJSON对象。
使用“$geoIntersects”查询位置相交的文档:
这样就会找到所有与customMapinfo区域有交集的文档。
使用“$within”查询完全包含在某个区域的文档:
使用“$near”查询附近的位置:
三、2d索引
2d索引也是mongoDB最常用的地理空间索引之一,用于游戏地图。2d索引用于扁平表面,而不是球体表面。如果用在球体表面上,在极点附近会出现大量的扭曲变形。
文档中应该使用包含两个元素的数组表示2d索引字段。
创建索引:
使用$near查询点[20,20]附近的文档:
使用$within查询出某个形状(矩形、圆形或者多边形)范围内的所有文档。
矩形,可以指定$box选项($box接受一个两元素的数组,第一个元素指定左下角的坐标,第二个元素指定右上角的坐标):
圆形,可以指定$center选项($center接受一个两元素数组作为参数,第一个元素是一个点,用于指定圆心,第二个元素用于指定半径):
领取专属 10元无门槛券
私享最新 技术干货