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)

MongoDB——索引类型之全文索引(Text Indexes)

MongoDB全文检索

纯MongoDB实现中文全文搜索

纯MongoDB实现中文全文搜索

纯MongoDB实现中文全文搜索