热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

xapianxunsearch的后端

2019独角兽企业重金招聘Python工程师标准Xapian是一款开源的C信息检索系统,内部系统试用了xunsearch,因此稍微了解了一下“虾片

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Xapian 是一款开源的C++信息检索系统,内部系统试用了xunsearch,因此稍微了解了一下“虾片”的机制

先看一下执行过程:


检索相关:
Xapian::Database 用于读取索引。
Xapian::Enquire 提供检索服务,与Xapian::Database配合使用
Xapian::QueryParser 查询语句解析器
Xapian::Query 查询语句
Xapian::MSet 检索返回的匹配结果记录集

建索引相关:
Xapian::WritableDatabase 用于建立索引。
Xapian::TermGenerator 非常简单的切词、建索引器,不是必须使用的,可用其他替代,但是提供了一些帮助函数,非常好用。

共用:
Xapian::Document 文档的抽象。
Xapian::SimpleStopper 停用词
Xapian::Error 异常类,.get_description()获取详细信息。

后端相关:
Xapian::Database::Internal     每个后端都要实现

Database,也可以称为Index
Database类型
- auto
- brass
- 当前开发中的后端,并将作为1.4.x版本起的默认后端
- chert
- 1.2.x的默认后端,支持增量修改、单写者+多读者的并发。
- 高效且可扩展
- flint
- 1.0.x的默认后端,类chert
- inmemory
- 全内存的database,可用于建立临时小database
- quartz
- 1.0的默认后端,1.1.0后移除 

文档
- 粒度
- RMDB:表中的一条记录
- html:一个html文件/一个标签
- 表示方式
- 32位 Document ID
- 3个组分
- 数据data
- 只存储,不分析其内容,通常用于结果的返回
- 是文档的部分/全部数据
- 词集terms
- 基本的查询单元
- 值域集values

分词器
- xapian没有Field的概念,通过在每个词前加前缀来标识
需要注意的是,在Xapian中,如果你在索引的时候使用了TermGenerate来进行分词,那在查询的时候一定要使用QueryParser来对查询条件进行解析

索引
一些限制:
- 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有多种数据库格式 

分面搜索(faceted search)
- 将搜索结果进行聚类处理

并行读写操作
- 写
数据库只支持单个数据库写对象存在
也就是说在创建一个DataBaseWritable对象的时候,会对数据库进行加锁,如果另一个写数据库对象再去写这个数据库时,会出现DatabaseLockError错误。
- 读
但是多个读对象是同时存在于同一个数据库。
- 更新
     -  读/写操作隔离
当打开一个数据库准备进行读操作时,会创建一个找开数据库的镜像,这样有写操作时,读对象是不可见的,除非读对象运行reopen()操作。
     - 限制
现在的Xapian多版本同步还是有一些限制的,特别是当数据库有两个版本同时存在时,也就是说有多个读,一个写数据库操作时,当写数据库只修改了数据库,运行了一次commit时,是没问题的,但是当写数据库又运行了第二次commit时,读数据库操作会收到了一个Xapian::DatabaseModifiedError,在这种情况下,读数据库操作要更新其数据库的镜像版本,使用reopen()操作,这个要在编程上注意一下。

数据同步
同时支持数据库的复制,而且只复制那些变更过的索引数据,这样可以使用数据冗余,达到负载均衡的目的 


常见问题
DatabaseLockError错误
- 数据库只支持单个数据库写对象存在,也就是说在创建一个DataBaseWritable对象的时候,会对数据库进行加锁,如果另一个写数据库对象再去写这个数据库时,会出现DatabaseLockError错误
- 但是多个读对象是同时存在于同一个数据库。

DatabaseModifiedError错误
- 当打开一个数据库准备进行读操作时,会创建一个找开数据库的镜像,这样有写操作时,读对象是不可见的,除非读对象运行reopen()操作。这样读/写操作就隔离了。
- 现在的Xapian多版本同步还是有一些限制的,特别是当数据库有两个版本同时存在时,也就是说有多个读,一个写数据库操作时,当写数据库只修改了数据库,运行了一次commit时,是没问题的,
- 但是当写数据库又运行了第二次commit时,读数据库操作会收到了一个Xapian::DatabaseModifiedError,在这种情况下,读数据库操作要更新其数据库的镜像版本,使用reopen()操作。

- 多线程支持
- Xapian没有显示的支持多线程,为了避免不必要的线程死锁,Xapian没有使用任何全局变量,所以你可以你的多线程应用中放心的使用Xapain对象。
- 但是一些Xapian对象内部是有关联的,如Xapian::Database::get_document(),返回的对象Xapian::Document对象内部保存了一个指向DataBase的一个引用,所以它不适合在多线程中使用,所以在多线程中使用Xapian的时候还是要注意一些东西的。

转:https://my.oschina.net/kakablue/blog/171240



推荐阅读
  • php网站设计实验报告,php网站开发实训报告
    本文目录一览:1、php动态网站设计的关键技术有哪些软件,及搭建步骤需要哪些页面,分别完成 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 域名解析系统DNS
    文章目录前言一、域名系统概述二、因特网的域名结构三、域名服务器1.根域名服务器2.顶级域名服务器(TLD,top-leveldomain)3.权威(Authoritative)域名 ... [详细]
  • 目录Atlas介绍Atlas部署Atlas基本管理Atlas结合MHA故障恢复读写分离建议Atlas介绍Atlas是由Qihoo360Web平台部基础架构团队开发维护的一个基于My ... [详细]
  • nginx使用内置模块配置限速限流的方法实例_nginx
    Nginx现在已经是最火的负载均衡之一,在流量陡增的互联网面前,接口限流也是很有必要的,尤其是针对高并发的场景,下面这篇文章主要给大家介绍了关于nginx使用内置模块配置限速限流的 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringCloudRibbon部分源码相关的知识,希望对你有一定的参考价值。1:ribbon是提供通过servi ... [详细]
  • LVS-DR直接路由实现负载均衡示例
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
author-avatar
手机用户2502858701
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有