用xapian来做索引

最近一个项目需要正则搜索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 中文分词算法

时间: 2024-11-09 02:24:57

用xapian来做索引的相关文章

enum可以做索引

enum可以做索引, 配上虚函数,或者函数指针,可以实现上层的统一封装和快速索引. 点击(此处)折叠或打开 MoTbl.cpp #include <stdio.h> #include <stdlib.h> enum { eA=0, eB, eC, eD, eMax }; class Bs{ public: virtual void say(){ printf("Bs\n"); } }; class A: public Bs{ int aa[1]; public:

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

索引的数据结构 为什么不是二叉树,红黑树什么的呢? 首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上.然后一般一个结点一个磁盘块,也就是读一个结点要进行一次IO操作. 而二叉树啊这些树类的数据结构,查找时间主要和树的高度有关,所以虽然一颗AVL树或者是红黑树在查找上比起顺序遍历的O(N)有了比较大的改善,但B树和B+树因为每个结点存的元素更多,所以查询更快,对磁盘的IO操作也更少. 为什么是B+树而不是B树呢? 1. 单一节点存储更多的元素(这样该节点

mysql为什么用b+树做索引

关键字就是key的意思 一.B-Tree的性质 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3.除根结点以外的非叶子结点的儿子数为[M/2, M]: 4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字:(至少2个关键字) 5.非叶子结点的关键字个数=指向儿子的指针个数-1: 6.非叶子结点的关键字:K[1], K[2], …, K[M-1]:且K[i] < K[i+1]: 7.非叶子结点的指针:P[1], P[2], …, P[M]:其中P

使用STL map 用 string 做索引 插入删除数据

1.代码 1 #include <map> 2 #include <string> 3 #include <stdio.h> 4 #include <vector> 5 #include <stdlib.h> 6 7 using namespace std; 8 9 class A 10 { 11 public: 12 int m_iX; 13 14 public : 15 A(); 16 A(int i); 17 ~A(); 18 }; 19

Xapian索引-文档检索过程分析

本文是Xapian检索过程的分析,本文内容中源码比较多.检索过程,总的来说就是拉取倒排链,取得合法doc,然后做打分排序的过程. 1 理论分析 1.1  检索语法 面对不同的检索业务,我们会有多种检索需求,譬如:要求A term和B term都在Doc中出现:要求A term或者B term任意在Doc中出现:要求A term或者B term任意在Doc出现,并且C term不出现…...,用符号表示: A & B A || B (A || B) & ~C ( A & ( B ||

长文本字段做自定义HASH索引

当要做URL匹配的时候,URL长度比较长,如果做文本索引,索引长度会很大, 用URL做64位HASH INT 索引长度才8个字节 function crcInt64($str) {     return ('0x' . hash('crc32', $str) . hash('crc32b', $str)) + 0; } 返回64位的INT 值... 数据库用 bigint 字段存储,做索引性能比URL做索引高好多倍.. 注意: mysql bigint 有个坑. 用bigint 的时候,在数据连

mysql数据库索引如何做?

MySQL索引底层的实现,今天简单聊一聊,少讲"是怎么样",更多说说"为什么设计成这样". 问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到<架构师之路>,一本本查,要查到什么时候去?于是,图书管理员设计了一套规则:(1)一楼放历史类,二楼放文学类,三楼放IT类-(2)IT类,又分软件类,硬件类-(3)软件类,又按照书名音序排序-以便快速找到一本书. 与之类比,数据库存储了1000W条数据,要从中找到name="she

16_索引是什么?

找数据有哪些方式? -- 全表扫描,但是当数据量达到几万以上,查询速度就慢了 什么是索引? -- 相当于书的目录,便于查找,索引指向字段, -- mysql使用 B+tree 索引,本质上是二叉树 索引有哪些分类? -- 普通:单列做索引,只能帮助查找 -- 唯一:单列增加唯一约束,只能设一个Null,也可以多列联合唯一 -- 主键:内容不允许重复,不能为Null,一张表只能有一个主键,可以多列联合主键 -- 组合:多列共同组合成索引,可以给多列增加唯一约束 -- 全文:分词,mysql依据逗号

Elasticsearch搜索API使用一:创建索引并指定索引类型的mapping

ES默认是动态创建索引和索引类型的mapping的.这就相当于无需定义Solr中的Schema,无需指定各个字段的索引规则就可以索引文件,很方便.但有时方便就代表着不灵活.比如,ES默认一个字段是要做分词的,但我们有时要搜索匹配整个字段却不行.如有统计工作要记录每个城市出现的次数.对于NAME字段,若记录"new york"文本,ES可能会把它拆分成"new"和"york"这两个词,分别计算这个两个单词的次数,而不是我们期望的"new