xapian安装使用
官方网站: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
————————————————
版权声明:本文为CSDN博主「农夫ben」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zll_liang/article/details/8048601
相关文章