关键字:搜索引擎、Xapian

  一篇拖了两三年的入门总结文章,今天发出来,一方面是自己的总结,另一方面是给自己和他人的备忘。读者需要对搜索引擎有初步了解,譬如了解倒排、term、doc、相似度打分等概念。

       Xapian是一个C++搜索引擎内核,提供了类似Lucene的功能,功能没有Lucene丰富,但可以满足常见的搜索需求:倒排检索、与或非查询、相关性打分排序等。

       下面对Xapian入门使用做介绍。

1、Xapian安装

下面介绍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]                                                              

编译安装:make –j2 && make install

注:valgrind 检查可能会执行很久,修改./configure 禁止掉它:在使用VALGRIND之前增加一行:VALGRIND=

2、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 = "007";

/// 创建索引
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中国", 1);
    doc.add_posting("T篮球", 1);
    doc.add_posting("T比赛", 1);
    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(0, 10);
    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 0;
}

makefile:

OBJ=hello_world.o
CC=g++ -std=c++11
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=1
--index finish--
--search start--
query=Xapian::Query((T中国 OR T比赛 OR T足球))
find results count=1
doc=中国篮球比赛,weight=0.308301,percent=66
--search finish--

 本文所在:https://www.cnblogs.com/cswuyg/p/10402218.html

02-20 02:48