最近一个项目需要正则搜索MongoDB,400多万的数据一次查询要20s以上,需要建立一个前端索引服务。本着部署简单、开发容易的原则,找到了xapian这个索引库。
我使用的是Python的接口,xapian的服务API相当简单,基本的流程是打开库、设置查询条件、取得查询结果。
_enquire = xapian.Enquire(xapian.Database(conf.IDX_DATABASE))
_enquire.set_query(xapian.Query(xapian.Query.OP_AND, keys))
matches = _enquire.get_mset(offset, limit)
logging.info(json.dumps({‘ids‘: [m.document.get_data() for m in matches], ‘total‘: matches.get_matches_estimated()})
建立索引的过程类似,难点在于如何建立索引以便于查询。长的文字可以用mmseg做分词,按分词结果建立索引,短的可以对单字建索引做联合查询。不考虑业务逻辑,建索引的流程就是在xapian的Document里面放原始数据,在term中放索引,加入DB,提交。
_db = xapian.WritableDatabase(conf.IDX_SONGS, xapian.DB_CREATE_OR_OPEN)
_enquire = xapian.Enquire(_db)
_enquire.set_query(xapian.Query(_id))
matches = _enquire.get_mset(0, 1)
if force or matches.empty():
if matches.empty():
doc= xapian.Document()
doc.set_data(_id)
else:
doc= matches[0].document
doc.clear_terms()
doc.add_term(_id)
if doc.get_docid() <= 0:
_db.add_document(doc)
else:
_db.replace_document(doc.get_docid(), doc)
_db.commit()
以下是部分相关博客: