• Xapian实战(三):索引


    参考资料:

    Xapian:Document, Value和Term

    Xapian:Database

    Xapian机制简要介绍

    1. Xapian中各类要点总结

    @ Database

    Database API参考

    WritableDatabase API参考

    Xapian的Database是所有用于检索的信息表的集合,根据xapian的不同有以下几种创建Database时可选择的后端类型:

    brass - 当前开发中的后端,并将作为1.4.x版本以后的默认后端;

    chert -

    1.2.x版本的默认后端,支持增量修改、单写+多读并发的模式;

    可以利用Chert Namespace中的open函数分别生成DataBase(仅读取功能)和WritableDatabase(支持读写)类型的数据库;

    Chert API参考

    flint - 1.0.x的默认后端,与chert类似;

    inmemory -

    全内存的database,可用于建立临时的小数据库;

    可以利用InMemory Namespace中的open函数创建WritableDatabase(支持读写)类型的数据库;

    InMemory API参考

    @ Document

    Document API参考

    Xapian中的Document包括三个元素:term, data, value;

    term -

    若Document D被名为T的term所描述,那么T被认为索引了D;

    Term可以使用TermGenerator生成:给TermGenerator对象设置Document,再将一段用空格分开的字符串传入TermGenerator对象中,就可以给Document加上这段文本的索引域了(英文单词使用空格分割可以直接使用TermGenerator,中文需要进行分词操作);

    value -

    每个Document中可有多个value,value可以方便在匹配过程中快速访问,它们可以用作排序、排队多余重复的document和范围检索等用途;

    data -

    每个Document中只有一个,可以为任意类型格式的数据,为最后搜索时向用户显示的内容;

    2. 实战

     @ Database / WritableDatabase

    // 创建Chert类型的可读写数据库
    Xapian::WritableDatabase writabledb = Xapian::Chert::open(dbname, Xapian::DB_CREATE_OR_OVERWRITE);
    
    // 向数据库中加入Document
    Xapian::Document mydoc;
    ...
    writabledb.add_document(mydoc);
    // 更改数据库后需要进行确认操作
    writabledb.commit();
    View Code

    @ Document

    Xapian::Document mydoc;
    // 设置data
    std::string data = "this is the description of a page";
    mydoc.set_data(data);
    // 设置value
    std::vector<std::string> value = {test1, test2};
    std::vector<std::string>::iterator itv = value.begin();
    int count = 1; // value的槽号
    for (; itv != value.end(); ++itv) {
      mydoc.add_value(count, *itv);
      ++ count;
    }
    // 设置term
    std::string newcontent; // 已经分词完毕带有空格的文档
    Xapian::TermGenerator indexer;
    indexer.set_document(mydoc);
    indexer.index_text(newcontent);
    
    // 显示data
    std::cout << mydoc.get_data() << std::endl;
    // 显示value
    Xapian::ValueIterator itvalue = mydoc.values_begin();
    for (; itvalue != mydoc.values_end(); ++itvalue) {
      std::cout << *itvalue << std::endl;
    }
    // 显示term
    Xapian::TermIterator iterm = mydoc.termlist_begin();
    for (; iterm != mydoc.termlist_end(); ++iterm) {
      std::cout << *iterm << std::endl;
    }
    View Code
  • 相关阅读:
    java实现字符串和LIST,MAP转换
    JAVA发送HttpClient请求及接收请求结果
    JVM内存溢出分析
    tomcat启动问题 严重: End event threw exception
    解决oracle11G密码过期问题
    查看和开启服务器端口
    tongweb安装后无法启动问题
    intellij与eclipse默认快捷键对比
    java实现pdf按页切分成图片
    ORACLE在IMP时候出现数据丢失
  • 原文地址:https://www.cnblogs.com/tanfy/p/5771277.html
Copyright © 2020-2023  润新知