最近一个项目需要正则搜索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()

以下是部分相关博客:

  1. 折腾XAPIAN的那点事 1

  2. Python bindings for Xapian

  3. In search of an inverted index library

  4. MMSEG 中文分词算法

用xapian来做索引的更多相关文章

  1. Xapian的内存索引-添加文档

    本文主要记录Xapian的内存索引在添加文档过程中,做了哪些事情. 内容主要为函数执行过程中的流水线. demo代码: Xapian::WritableDatabase db = Xapian::In ...

  2. Xapian的内存索引

    关键字:xapian.内存索引 xapian除了提供用于生产环境的磁盘索引,也提供了内存索引(InMemoryDatabase).内存索引.我们可以通过观察内存索引的设计,来了解xapian的设计思路 ...

  3. enum可以做索引

    enum可以做索引 enum可以做索引, 配上虚函数,或者函数指针,可以实现上层的统一封装和快速索引. 点击(此处)折叠或打开 MoTbl.cpp #include <stdio.h> # ...

  4. redis为何单线程 效率还这么高 为何使用跳表不使用B+树做索引(阿里)

    如果想了解 redis 与Memcache的区别参考:Redis和Memcache的区别总结 阿里的面试官问问我为何redis 使用跳表做索引,却不是用B+树做索引 因为B+树的原理是 叶子节点存储数 ...

  5. python中list不能做索引

    先看python中内置的list不能作为字典的key. 可将list或者ndarray转化为tuple再做索引. list不能进行hash: import numpy as np a1 = np.ar ...

  6. 2020-05-18:MYSQL为什么用B+树做索引结构?平时过程中怎么加的索引?

    福哥答案2020-05-18:此答案来自群员:因为4.0成型那个年代,B树体系大量用于文件存储系统,甚至当年的Longhorn的winFS都是基于b树做索引,开源而且好用的也就这么个体系了.B+树的磁 ...

  7. MySQL用B+树(而不是B树)做索引的原因

    众所周知,MySQL的索引使用了B+树的数据结构.那么为什么不用B树呢? 先看一下B树和B+树的区别. B树 维基百科对B树的定义为"在计算机科学中,B树(B-tree)是一种树状数据结构, ...

  8. 为什么Mysql用B+树做索引而不用B-树或红黑树

    B+树做索引而不用B-树 那么Mysql如何衡量查询效率呢?– 磁盘IO次数. 一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上. ...

  9. 为什么用B+树做索引&MySQL存储引擎简介

    索引的数据结构 为什么不是二叉树,红黑树什么的呢? 首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上.然后一般一个结点一个磁盘块,也就是读一个结点要进行一次 ...

随机推荐

  1. Vue-cli add sass modules

    终端cd至要安装的文件夹中 再执行以下命令 安装node-sass 和 sass-loader npm i node-sass sass-loader --save-dev 在需要使用scss地方引入 ...

  2. kubernetes源码分析 -- kube-proxy

       Kube-proxy需要在每一个minion结点上运行.他的作用是service的代理,负责将业务连接到service后面具体执行结点(endpoints). 我们列一下体现kube-proxy ...

  3. 轻量级 HTTP(s) 代理 TinyProxy

      J CentOS 下安装 TinyProxy yum install -y tinyproxy 启动.停止.重启 # 启动service tinyproxy start# 停止service ti ...

  4. pip 批量更新

    1. pip3 list --outdated >> requests  现将要更新的列表写入requests 2.对文件中的数据进行处理 Package        Version   ...

  5. char数组

    *****************************************************************char 类型的数组(c语言中是没有字符串的)char name[20 ...

  6. matlab C++ (VS Qt)混合编程 / mxArray / QT5中文乱码

    一.混合编程环境搭建---依据我的情况,分成了4个部分: 1:破解matlab,因为matlab破解不完全,编译器不能使用,会出错.(参考https://blog.csdn.net/a12593012 ...

  7. binding与属性

    Text="{Binding Path=SearchKeyWord, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 将“源”显 ...

  8. Tomcat中session共享问题的简单解决办法

    tomcat-redis-session-manager 使用redis配置tomcat共享session 结构图: 分析: 分布式web server集群部署后需要实现session共享,针对 to ...

  9. IOS-CocoaPods的详细安装与使用

    1.为什么需要CocoaPods 在进行iOS开发的时候,总免不了使用第三方的开源库,比如SBJson.AFNetworking.Reachability等等.使用这些库的时候通常需要: 下载开源库的 ...

  10. python 连接操作 各类数据库

    转载自MySQL Loners 一,python 操作 MySQL:详情见:这里 #!/bin/env python # -*- encoding: utf-8 -*- #-------------- ...