mongodb的全文索引实现
Posted AI量化实验室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb的全文索引实现相关的知识,希望对你有一定的参考价值。
其实05年开始接触并使用lucene做垂直搜索,到后来elastic search/solr。全文索引一直都是lucene的专利。后来es/solr也越来越强大,朝着nosql的方向去了,可以做各个维度的统计分析。
反过来,nosql的代表之一mongo也开始支持全文索引。
为什么对mongo的全文索引感兴趣。写过es的dsl的语法的人都知道,太太麻烦了。本人一直追求优雅的技术,优雅的实现,所以,还是要尝试一下mongo的全文索引功能。
很可惜,普通版本不支持中文索引。那怎么办?
自己分词。这里我们选用jieba。
把title和content用jieba分词并存在到一个“tags”的字段,写入mongodb。
dict_item['tags'] = ' '.join(jieba.cut(dict_item['title'] + ' ' + dict_item['content']))
全文索引的查询:
主要是如下这一行,不需要指定字段,因为只会查$text的索引。支持多个词一起查询,是或的关系。
query_dict['$text'] = {'$search':keyword}
def query(self,dt_start,dt_end,keyword=None,page=None,page_size=None,):
query_dict = {'datetime':{'$gte':dt_start,'$lte':dt_end}}
if keyword is not None:
query_dict['$text'] = {'$search':keyword}
total = self.mongo_db['articles'].count(query_dict)
items = self.mongo_db['articles'].find(query_dict).sort('datetime',pymongo.DESCENDING)
if page is not None and page_size is not None:
items = items.skip(page*page_size).limit(page_size)
result = {'total':total,'items':list(items)}
return result
pymongo创建$text索引:
def create_index(tb,col):
db = get_mongodb()
db[tb].create_index([('tags',pymongo.TEXT)])
如上就可以了。
扫描下方二维码,关注:AI量化实验室(ailabx),了解AI量化最前沿技术、资讯。
以上是关于mongodb的全文索引实现的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB——索引类型之全文索引(Text Indexes)