Xapian使用入門

  關鍵字:搜索引擎、Xapianphp

  一篇拖了兩三年的入門總結文章,今天發出來,一方面是本身的總結,另外一方面是給本身和他人的備忘。讀者須要對搜索引擎有初步瞭解,譬如瞭解倒排、term、doc、類似度打分等概念。html

       Xapian是一個C++搜索引擎內核,提供了相似Lucene的功能,功能沒有Lucene豐富,但能夠知足常見的搜索需求:倒排檢索、與或非查詢、相關性打分排序等。ios

       下面對Xapian入門使用作介紹。c++

一、Xapian安裝-Linuxgit

下面介紹Linux下的編譯安裝。github

(1)下載源碼shell

https://oligarchy.co.uk/xapian(推薦)或者 https://github.com/xapian/xapian 下載xapian-core包。從github下載的包不包括./configure文件,須要本身使用autoconf生成。xapian-core不一樣版本對GCC有不一樣要求,能夠看github下的INSTALL文件。windows

(2)解壓&安裝api

解壓:xz -d xx.tar.xz    tar xvf xx.tar                                                                                app

配置:./configure --prefix=[your install path]                                                              

編譯安裝:make –j2 && make install

注:valgrind 檢查可能會執行好久,修改./configure 禁止掉它:在使用VALGRIND以前增長一行:VALGRIND=

二、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,須要設置鏡像地址,參考:https://blog.csdn.net/callinglove/article/details/48601775

3. 安裝zlib。能夠直接使用編譯好的32位版本,下載地址: http://gnuwin32.sourceforge.net/downlinks/zlib-lib-zip.php

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;

五、在msys2下,進入到代碼目錄,執行configure:

./configure LD=link CC="cl -nologo" CXX="$PWD/compile cl -nologo" CXXFLAGS="-EHsc -Z7" AR=lib CPPFLAGS=-IC:/zlib-1.2.3-lib/include LDFLAGS="-LC:/zlib-1.2.3-lib/lib" --prefix="C:/xapian-install"

六、./configure跑完以後,執行make

七、執行make install

八、建立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

三、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--

demo github:https://github.com/cswuyg/xapian_exercise/tree/master/hello_world 

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

相關文章
相關標籤/搜索