xapian安装使用

陶鸿畴
2023-12-01
官方网站:http://xapian.org/


xapian 作为全文搜索引擎,分为三大模块:indexer(索引) databases(数据库管理) searcher(搜索)

包含在以下类:

xapian::WriteDatabase
xapian::document
xapian::database
xapian::enquire
xapian::query
xapian::mset

中文分词:libmmseg scws

1、安装

wget http://oligarchy.co.uk/xapian/1.2.12/xapian-core-1.2.12.tar.gz
tar -zxvf xapian-core-1.2.12.tar.gz
cd xapian-core-1.2.12
./configure  --prefix=/opt/xapian
make
make install

安装语言包,现在是安装php的:

wget http://oligarchy.co.uk/xapian/1.2.12/xapian-bindings-1.2.12.tar.gz
tar -zxvf xapian-bindings-1.2.12.tar.gz
cd xapian-bindings-1.2.12
./configure --prefix=/opt/xapian-binding XAPIAN_CONFIG=/opt/xapian/bin/xapian-config --with-php PHP_CONFIG=/usr/local/webserver/php/bin/php-config
make && make install

文件说明:

/bin/copydatabase		拷贝数据库			eg:./copydatabase /opt/xapian/db/test.db/ /opt/xapian/db/test.db2
/bin/quest			搜索命令			eg:./quest -d /opt/xapian/db/test.db/ -m 10 "中国"
/bin/simpleindex		产生简单的索引库
/bin/xapian-check		xapian数据库检查
/bin/xapian-compact		优化数据库,合并数据库
/bin/xapian-replicate		从服务器拉起		eg:./xapian-replicate -h 127.0.0.1 -p 99 -m test.db replicate.db
/bin/xapian-replicate-server	主从服务器	eg:./xapian-replicate-server -p 99 /opt/xapian/db/
/bin/delve			查看xapian数据库相关情况,如总共多少条记录,或分词的信息等. eg:./delve -d /opt/xapian/db/test.db
/bin/simplesearch		简单的搜索,很方便 eg:./simplesearch /opt/xapian/db/test.db "中国"
/bin/xapian-config	        xapian的相关配置情况
/bin/xapian-progsrv 		远程索引。 eg:Xapian::Database database(Xapian::Remote::open("ssh", "search xapian-progsrv /opt/xapian/db/test.db"));
/bing/xapian-tcpsrv		远程索引TCP_IP方式。 eg:Xapian::Database database(Xapian::Remote::open("searchserver", 99));


一个文档(Document)有三部分组成,数据(data),词集(terms),值域集(values)
索引限制:


一下是索引数据的一些限制:
Term Length:一个词限制在256个字节内,
Document Data:一个data区不能大于100MB,默认是8KB
Document value:和一个data区的限制是一样的,但一般建议value不要太大
Document ID: 当前范围是32bit,大概在43亿左右,文档删除的ID号不会被重新利用,除非你对数据库进行compact
B-tree block number: 目前支持最大为32bit个块
OS file size:所有操作系统对于单个文档的限制对于Xapian都适用,如ext4对于单个文件的大小为16TB,
Document length:文档长度的存储限制为unsigned 64bit


使用:


添加文档:

Xapian::WritableDatabase db("/opt/xapian/db/test.db", Xapian::DB_CREATE_OR_OPEN);

Xapian::TermGenerator indexer;
Xapian::Stem stemer("english");
indexer.set_stemmer(stemer);

string line = "我是中国人,by:农夫";

Xapian::Document doc;
doc.set_data(line);
indexer.set_document(doc);		
indexer.index_text("我 是 中国人 农夫");		//设置分词,以空格分开 

db.add_document(doc);					//添加文档
db.commit();


搜索:

Xapian::Database db("/opt/xapian/db/test.db");

Xapian::Enquire enquire(db);

string query_string = "中国人";
Xapian::QueryParser qp;
Xapian::Stem stemmer("english");
qp.set_stemmer(stemmer);
qp.set_database(db);
qp.set_stemming_strategy(Xapian::QueryParser::STEM_NONE);
Xapian::Query query = qp.parse_query(query_string);


cout << "Parsed query is: " << query.get_description() << endl;

enquire.set_query(query);
// 得到查询结果
Xapian::MSet matches = enquire.get_mset(0, 10);

// Display the results.
cout << matches.get_matches_estimated() << " results found.\n";
cout << "Matches 1-" << matches.size() << ":\n" << endl;


// 得到查询结果
for (Xapian::MSetIterator i = matches.begin(); i != matches.end(); ++i) {
cout << i.get_rank() + 1 << ": " << i.get_percent() << "% docid=" << *i
     << " [" << i.get_document().get_data() << "]\n\n";
}


删除文档:

Xapian::WritableDatabase db("/opt/xapian/db/test.db", Xapian::DB_CREATE_OR_OPEN);

db.delete_document("农夫");		//以检索词删除文档

db.commit();
cout<<"ok"<<endl;
exit(0);


Query
如果不想使用字符串形式的查询表达式,可以用下面这些操作符将多个Query组合起来:
OP_AND 
等同于QueryParser所支持的AND
OP_OR 
等同于QueryParser所支持的OR
OP_AND_NOT 
等同于QueryParser所支持的AND_NOT
OP_XOR 
等同于QueryParser所支持的XOR
OP_AND_MAYBE 
只返回左边子表达式匹配的documents,不过两边的表达式所匹配的documents都加入权重计算。
OP_FILTER 
作用跟AND相似,不过仅仅左边的表达式匹配的documents才加入权重计算。
OP_NEAR 
等同于QueryParser所支持的NEAR
OP_PHRASE 
等同于QueryParser所支持的ADJ
OP_VALUE_RANGE 
等同于QueryParser所支持的范围搜索
OP_SCALE_WEIGHT 
给子表达式指定权重,如果权重为0,则此表达式为纯布尔型查询
OP_ELITE_SET 
作用跟OP_OR 很相似,不过有时候性能比OP_OR 要好。这里有详细的解释:http://trac.xapian.org/wiki/FAQ/EliteSet
OP_VALUE_GE 
返回大于或等于给定的document value
OP_VALUE_LE 
返回小于或等于给定的document value

 类似资料: