Xapian使用入门
关键字:搜索引擎、Xapian
一篇拖了两三年的入门总结文章,今天发出来,一方面是自己的总结,另一方面是给自己和他人的备忘。读者需要对搜索引擎有初步了解,譬如了解倒排、term、doc、相似度打分等概念。
Xapian是一个C++搜索引擎内核,提供了类似Lucene的功能,功能没有Lucene丰富,但可以满足常见的搜索需求:倒排检索、与或非查询、相关性打分排序等。
下面对Xapian入门使用做介绍。
1、Xapian安装-Linux
下面介绍Linux下的编译安装。
(1)下载源码
从https://oligarchy.co.uk/xapian(推荐)或者 https://github.com/xapian/xapian 下载xapian-core包。从github下载的包不包括./configure文件,需要自己使用autoconf生成。xapian-core不同版本对GCC有不同要求,可以看github下的INSTALL文件。
(2)解压&安装
解压:xz -d xx.tar.xz tar xvf xx.tar
配置动态库:./configure --prefix=[your install path]
配置静态库:./configure --prefix=[your install path] --enable-static=yes --enable-shared=false
编译安装:make –j2 && make install
注1:如果你编译出来的xapian lib静态库要作为你so库的一部分,那么在./configure 命令加上一句: CXXFLAGS=-fpic
注2:valgrind 检查可能会执行很久,修改./configure 禁止掉它:在使用VALGRIND之前增加一行:VALGRIND=
2、Xapian安装-windows
这里采用MSVC做编译链接,方便后续对xapian源码做单步调试。因为对msys、vs命令行不熟悉,折腾了很久,特别感谢作者olly在xapian邮件组提供的帮助。
环境:windows 7 & Visual Studio 2017
源码包:xapian-core-1.4.10 (注意:xapian1.2到1.4之间的一部分版本不支持windows编译安装)
步骤如下:
1. 安装Visual Studio 2017
2. 安装msys2。下载地址:http://repo.msys2.org/distrib/x86_64/msys2-x86_64-20180531.exe;
2.1 在msys2下安装make,
pacman -S make
可能需要设置镜像地址,参考:https://blog.csdn.net/callinglove/article/details/48601775
3. 安装zlib。可以直接使用编译好的32位版本,下载地址: http://gnuwin32.sourceforge.net/downlinks/zlib-lib-zip.php 。有时候线上的版本可能缺少某些库函数,可以使用附件中的zlib。
4. 启动msys2。首先,启动cmd;然后,在cmd下执行VS2017的环境变量批处理——vcvars32.bat(因为zlib是32位的,所以这里也选择32位),譬如:C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvars32.bat;接着,继续在cmd下启动msys2, 命令:msys2_shell.cmd -use-full-path;然后,在msys2 shell下面执行 which cl,确认能找到cl;
5、在msys2下,进入到代码目录,执行configure:
./configure LD=link CC="cl -nologo" CXX="$PWD/compile cl -nologo" CXXFLAGS="-EHsc -Z7" AR=lib CPPFLAGS=-IC:/zlib-1.2.-lib/include LDFLAGS="-LC:/zlib-1.2.3-lib/lib" --prefix="C:/xapian-install"
如果出现找不到zlib.h的错误,需要检查一下xapian目录下的config.log文件,可能是因为找不到unistd.h头文件导致的。解决办法:修改zconf.h的 #if 1,修改为 #if HAVE_UNISTD_H
6、./configure跑完之后,执行make
7、执行make install
8、创建VS2017 工程
8.1 把项目设置为Release x86;
8.2 在项目属性的 C/C++-->General 修改Addtional Include Directories,加上xapian的include路径;
8.3 在项目属性的 C/C++-->Code Generation修改Release下的Runtime Library为 /MT (我们编译的xapian运行时库用的MT,需要确保一致)
8.4 在项目属性中 Linker-->General修改Additional Library Directories,加上xapian的lib目录和zlib的lib目录;
8.5 在项目属性的 Linker-->input中加上Rpcrt4.lib 和 Ws2_32.lib
8.6 将zlib1.dll拷贝到跟编译生成的exe文件同目录下,否则exe启动会有错误提示:应用程序无法正常启动(0xc000007b)
至此,就可以在VS2017下跑起xapian的demo程序,并对xapian的源码进行单步调试。
demo github:https://github.com/cswuyg/xapian_exercise/tree/master/ram_xapian
3、Hello World
demo例子:对“中国篮球比赛”建索引,然后使用OR语法做检索,输出检索结果信息。
代码:
/***************************************************************************
*
* @file hello_world.cpp
* @author cswuyg
* @date 2019/01
* @brief xapian first demo
*
**************************************************************************/
#include <iostream>
#include "xapian.h" const char* const K_DB_PATH = "index_data";
const char* const K_DOC_UNIQUE_ID = ""; /// 创建索引
void createIndex() {
std::cout << "--index start--" << std::endl;
Xapian::WritableDatabase db(K_DB_PATH, Xapian::DB_CREATE_OR_OPEN); Xapian::Document doc;
doc.add_posting("T中国", );
doc.add_posting("T篮球", );
doc.add_posting("T比赛", );
doc.set_data("中国篮球比赛");
doc.add_boolean_term(K_DOC_UNIQUE_ID); Xapian::docid innerId = db.replace_document(K_DOC_UNIQUE_ID, doc); std::cout << "add doc innerId=" << innerId << std::endl; db.commit(); std::cout << "--index finish--" << std::endl;
} /// 检索索引
void queryIndex() {
std::cout << "--search start--" << std::endl;
Xapian::Query termOne = Xapian::Query("T中国");
Xapian::Query termTwo = Xapian::Query("T比赛");
Xapian::Query termThree = Xapian::Query("T足球");
auto query = Xapian::Query(Xapian::Query::OP_OR, Xapian::Query(Xapian::Query::OP_OR, termOne, termTwo), termThree);
std::cout << "query=" << query.get_description() << std::endl; Xapian::Database db(K_DB_PATH);
Xapian::Enquire enquire(db);
enquire.set_query(query);
Xapian::MSet result = enquire.get_mset(, );
std::cout << "find results count=" << result.get_matches_estimated() << std::endl; for (auto it = result.begin(); it != result.end(); ++it) {
Xapian::Document doc = it.get_document();
std::string data = doc.get_data();
Xapian::weight docScoreWeight = it.get_weight();
Xapian::percent docScorePercent = it.get_percent(); std::cout << "doc=" << data << ",weight=" << docScoreWeight << ",percent=" << docScorePercent << std::endl;
} std::cout << "--search finish--" << std::endl;
} int main() {
createIndex();
queryIndex();
return ;
}
makefile:
OBJ=hello_world.o
CC=g++ -std=c++
CFLAGS=
XAPIANROOTDIR=/usr/local/app/cswuyg/xapian_proj/install/
INCLUDE=-I$(XAPIANROOTDIR)include/
LIBS=-lxapian
hello_world: $(OBJ)
$(CC) $(CFLAGS) -o hello_world $(OBJ) -L$(XAPIANROOTDIR)lib $(LIBS)
hello_world.o: hello_world.cpp
$(CC) $(CFLAGS) -c hello_world.cpp $(INCLUDE)
clean:
rm *.o
运行结果:
--index start--
add doc innerId=
--index finish--
--search start--
query=Xapian::Query((T中国 OR T比赛 OR T足球))
find results count=
doc=中国篮球比赛,weight=0.308301,percent=
--search finish--
demo github:https://github.com/cswuyg/xapian_exercise/tree/master/hello_world
本文所在:https://www.cnblogs.com/cswuyg/p/10402218.html
附件:
https://files.cnblogs.com/files/cswuyg/zlib-1.2.3-lib.7z
Xapian使用入门的更多相关文章
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Oracle分析函数入门
一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- wepack+sass+vue 入门教程(二)
六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...
- wepack+sass+vue 入门教程(一)
一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...
随机推荐
- LOJ#3048. 「十二省联考 2019」异或粽子 Trie
原文链接www.cnblogs.com/zhouzhendong/p/LOJ3048.html 题解 $O(n\log^2 {a_i})$ 的做法比较简单: 1. 求出第 k 大的是什么: 二分答案, ...
- 关于<Servlet>定义
1,百度百科定义: Servlet,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容 ...
- Python制作微信小助手
网址: https://mp.weixin.qq.com/s/uWSgeD5FyzXV3LsMNus01Q
- HTML5通讯协议——WebSocket
1.导入maven依赖 <!-- websocket --> <dependency> <groupId>org.springframework</group ...
- 多个PVSS数据点属性读写的优化处理
注:本译文出自15多年前,尚未用最新软硬件平台进行重新测试,只提供方法论层面的参考,具体性能指标不具备参考意义. 多个PVSS数据点属性读写的优化处理 本文档概述了测试三种读取和写入多个PVSS数据点 ...
- 按月分表(create table)
PHP 按月分表控制台命令(yii2版) <?php /** * @Purpose: 按月分表脚本 * @User: Chrdai * @Date: 2019/3/19 * @Time: 15: ...
- vue路由传参的三种方式区别(params,query)
最近在做一个项目涉及到列表到详情页的参数的传递,网上搜索一下路由传参,结合自己的写法找到一种适合自己的,不过也对三种写法都有了了解,在此记录一下 <ul class="table_in ...
- 大数据计算框架Hadoop, Spark和MPI
转自:https://www.cnblogs.com/reed/p/7730338.html 今天做题,其中一道是 请简要描述一下Hadoop, Spark, MPI三种计算框架的特点以及分别适用于什 ...
- Prometheus 自定义exporter 监控key
当Prometheus的node_exporter中没有我们需要的一些监控项时,就可以如zabbix一样定制一些key,让其支持我们所需要的监控项. 例如,我要根据 逻辑cpu核数 来确定load的告 ...
- cadence焊盘及元件封装制作
前面学习了元件封装的制作,由于琐碎事情的耽误,加上学习python,没有及时的总结这部分内容,现在做一个补充!