当前位置: 首页 > 工具软件 > Xapian > 使用案例 >

xapian_使用Xapian和Omega读取文档并建立索引

纪畅
2023-12-01

xapian

Xapian基础

Xapian和Omega是独立的组件,旨在共同提供索引和搜索功能。 Xapian组件提供了数据库功能(用于存储信息)的核心,以及用于查找单词和单词组合的搜索和检索系统(请参阅参考资料 )。

Omega组件提供了将信息从各种格式转换和解析为Xapian所需的原始文本的工具,以便可以对其进行索引。 Omega利用多种工具(例如pdftotext ,然后提交经过翻译和过滤的基于文本的信息,以便可以识别文档的索引和结构并将其存储在Xapian数据库中。 Omega是Xapian下载的一部分。

安装Xapian

Xapian组件是通过简单的tar.gz下载提供的,可以使用通常的configuremake步骤来构建。 首先,通过键入以下内容来解压缩档案:

$ tar zxf xapian-core-1.2.0.tar.gz.

通过输入$ cd xapian-core-1.2.0.进入目录$ cd xapian-core-1.2.0.

然后输入以下内容进行配置:

$ ./configure.

您可能需要将代码安装到其他位置。 例如,如果要将Xapian组件安装到主目录中,请使用prefix选项:

$ ./configure --prefix=/home/xapian.

然后使用make进行构建:

$ make.

最后,安装库和工具。 请记住,您将需要超级用户/ root才能将这些组件安装到标准位置(/ usr / local / bin和/ usr / local / lib): $ make install

安装了主要的Xapian工具包后,您可以继续安装Omega组件。

安装欧米茄

Omega的安装步骤与Xapian核心安装相同。 通过键入$ tar zxf xapian-omega-1.2.0.tar.gz.提取档案$ tar zxf xapian-omega-1.2.0.tar.gz.

转到目录:

$ cd xapian-omega-1.2.0

运行配置:

$ ./configure.

请注意,如果您在特定目录中而非默认位置中安装了Xapian,则可能需要指定所提供的配置工具的位置,该工具提供Xapian组件的安装和库位置:

$ ./configure --prefix=/home/xapian XAPIAN_CONFIG=/home/xapian/bin/xapian-config.

最后,构建并安装各种工具,如下所示。

$ ./make
$ ./make install

而已。 您已准备好开始建立索引信息,然后检索结果。

索引数据

使用Xapian的第一步是通过添加一些文档为数据库填充信息。 Xapian数据库使用目录/ URL样式的寻址方法来分隔数据,因此您可以将信息组织到不同的位置,从而使其可以根据需要搜索整个索引数据库和数据库的特定区域。

要填充数据,您可以编写自己的索引和提交系统,该系统会将数据提供给Xapian索引进行处理。 但是,这很耗时,在许多情况下,您可能会为标准数据类型建立索引,例如HTML,PDF或其他材料。 当使用Omega工具为您智能地转换,转换和索引数据时,Xapian支持所有这些类型。

omindex工具可以omindex文件目录,标识可以建立索引的文件,然后根据需要将它们添加到索引中。 要创建新索引,必须指定索引名称,用于标识索引中信息的URL以及文件可以位于的目录。 例如,您可以为目录结构建立索引,如下所示:

$ omindex --db info --url information /mnt/data0/Information.

这将启动索引过程,并加载文件。 您可以看到清单1中显示索引过程的输出样本(在某些地方进行了修剪)。

清单1.显示索引过程的示例输出
[Entering directory /]
[Entering directory /Manuals]
[Entering directory /Manuals/Amazon]
Indexing "/Manuals/Amazon/prod-adv-api-dg-20091001.pdf" as application/pdf ... added.
[Entering directory /Manuals/Apple]
Indexing "/Manuals/Apple/Leopard_Server_OSX.5.pdf" as application/pdf ... added.
Indexing "/Manuals/Apple/Extending_Your_Wiki_Server.pdf" as application/pdf ... added.
...
[Entering directory /Manuals/OmniGroup]
[Entering directory /Manuals/OmniGroup/OmniPlan]
Indexing "/Manuals/OmniGroup/OmniPlan/OmniPlan-1.0-mini-manual.pdf" 
  as application/pdf ... added.
Indexing "/Manuals/OmniGroup/OmniPlan-Manual.pdf" as application/pdf ... added.
[Entering directory /Manuals/Asus]
Indexing "/Manuals/Asus/e2968b_p5n-e sli.pdf" as application/pdf ... added.
[Entering directory /Manuals/Asterisk]
Indexing "/Manuals/Asterisk/Asterisk Handbook.pdf" as application/pdf ... added.
[Entering directory /Manuals/VirtualBox]
Indexing "/Manuals/VirtualBox/VBoxUserManual.pdf" as application/pdf ... added.
[Entering directory /Books]
[Entering directory /Books/Apache Cookbook]
Indexing "/Books/Apache Cookbook/44386-12004-14591-0-596-00191-6-apacheckbk
  -CHP-3.PDF" as application/pdf ... added.
...
Indexing "/Books/TheArtofSEO1stEdition.pdf" as application/pdf ... added.
[Entering directory /Books/Apache Definitive Guide 3ed]
Indexing "/Books/Apache Definitive Guide
 3ed/44385-12004-14591-0-596-00203-3-apache3-CHP-10.PDF" as application/pdf ... added.
[Entering directory /Books/IBM]
[Entering directory /Books/IBM/Redbooks]
Indexing "/Books/IBM/Redbooks/sg246622.pdf" as application/pdf ... added.
Indexing "/Books/IBM/Redbooks/sg247186.pdf" as application/pdf ... added.

在这种情况下,该目录主要包含PDF文档,但是如果您具有正确的筛选器工具,则可以使用HTML,Microsoft Office,Abiword等实现相同的结果。 必须在系统上安装这些工具,才能将源材料转换为Xapian可以索引的文本格式。 您可以通过查看Omega文档来找到关于此的更多信息(请参阅参考资料 )。 如果要爬网网站并为其建立索引,可以使用htdig2omega ,它接受URL并搜索整个网站。

建立初始数据库后,可以继续向数据库中添加其他文档和目录,尽管您应该使用其他URL目录来执行此操作,以便可以在索引中更明确地找到文档。 您应该使用-p选项来确保在添加过程中不会删除现有文档:

$ omindex -p --db info --url documents /mnt/data0/Documents.

现在,让我们看看如何从已创建的索引中获取信息。

搜索数据库

为了快速轻松地测试文档索引,可以使用quest命令行工具。 这接受数据库目录作为参数之一,然后接受以Xapian格式编写的查询字符串。 例如,您可以使用清单2中的命令搜索一个单词。

清单2.使用quest工具搜索单词redbook
$ quest --db=info redbook
Query: Xapian::Query(Zredbook:(pos=1))
MSet:
7218 [100%]
url=info/Books/IBM/Redbooks/sg246622.pdf
sample=Front cover AIX and Linux Interoperability Effective centralized user
 management in AIX 5L and Linux environments Sharing files and printers between 
AIX 5L and Linux systems Learn interoperable networking solutions Abhijit Chavan 
Dejan Muhamedagic Jackson Afonso Krainer Janethe Co KyeongWon Jeong ibm.com/redbooks
 International Technical Support Organization AIX and Linux Interoperability April
 2003 SG24-6622-00 Note: Before using this information and the product it supports,
 read the information in ...
caption=SG246622.book
type=application/pdf
modtime=1050429813
size=4466549
7219 [98%]
url=info/Books/IBM/Redbooks/sg247186.pdf
sample=Front cover Solaris to Linux Migration: A Guide for System Administrators A
 comprehensive reference for a quick transition Presents a task-based grouping of
 differences between the operating system environments Additional content about how to
 optimize Linux on IBM Eserver platforms Mark Brown Chuck Davis William Dy Paul
 Ionescu Jeff Richardson Kurt Taylor Robbie Williamson ibm.com/redbooks International
 Technical Support Organization Solaris to Linux Migration: A Guide for System
 Administrators February ...
caption=Solaris to Linux Migration: A Guide for System Administrators
type=application/pdf
modtime=1138980702
size=3743923

在Xapian系统中,您可以对查询结构进行更具体的说明,指定您希望将单词组合在一起,或将不同的单词和其他结构组合在一起。

与许多系统一样,Xapian提供了许多运算符,可让您指定要搜索的信息。 支持的主要功能有:

  • AND —匹配单词或表达式都匹配的文档
  • OR —匹配两个表达式匹配的文档
  • NOT —匹配第一个子表达式所在的文档
  • XOR —匹配第一个或第二个表达式匹配但不都匹配的文档

对于习惯使用Google系统的用户,您还可以使用+-标记单词。 例如: +IBM +Java -WebSphere

对于更细粒度的搜索,您还可以执行NEAR搜索以查找其他单词附近的单词( ADJ ), ADJ查找其他单词附近的单词,但仅按指定顺序进行。 两者都通过使用ADJ/6来支持单词阈值(默认值为10),其中6是单词限制。 例如, IBM NEAR Java将查找彼此靠近的两个单词,而IBM ADJ Java将仅查找彼此靠近的那些单词,其中IBM在第一位,Java在第二位。

当然,以这种方式解析输出不是很有用。 在大多数情况下,您将需要将搜索结果集成到网站或其他应用程序中。 Xapian / Omega为此提供了不同的解决方案,具体取决于所需的集成级别。

使用Omega网络界面

Omega带有基于模板的Web界面,该界面本身非常强大,同时提供了Xapian数据库的直接界面。 要使用它,您需要将omega命令复制到配置的CGI-BIN目录中,或复制到配置为支持CGI脚本的任何目录中。 您也可以在CGI目录和安装Omega时安装的版本之间创建符号链接。 两者之间的区别在于每种情况下配置文件的位置。

如果已将omega命令复制到CGI目录中,请创建一个名为omega.conf的本地配置文件。 如果使用了符号链接,则需要在安装目录中编辑配置文件。 默认情况下,这是/usr/local/etc/omega.conf。

该配置文件需要三个配置设置,即您创建的Xapian数据库的位置以及包含将在搜索和输出过程中进行解析的Omega模板的模板目录的位置。 清单4中显示了一个示例配置文件。

清单3.示例配置文件
# Directory containing Xapian databases:
database_dir /var/lib/omega/data

# Directory containing OmegaScript templates:
template_dir /var/lib/omega/templates

# Directory to write Omega logs to:
log_dir /var/log/omega

在这种情况下,先前创建的数据库已被复制到/ var / lib / omega / data目录中,因此您可以对其进行搜索。

然后,您可以创建包含搜索表单的查询文档并显示结果。 主模板文档应称为查询,并放在模板目录中。 该文件的格式和结构是HTML,其中包含嵌入的OmegaScript术语以执行搜索。 在模板目录的Xapian / Omega tarball中提供了模板的样本文件集合。 内容和结构非常复杂,但是您可以将该目录复制到配置的模板目录中,以了解可能的情况。

更好的解决方案是通过现有的应用程序和Web部署环境(例如Java,Perl或PHP)使用Xapian索引的众多接口之一。

与其他应用程序集成

如果您构建Xapian Bindings软件包(使用与之前构建Omega工具相同的顺序),则可以在配置中找到Java,PHP,Python和Ruby的扩展名。

例如,清单4显示了一个使用Python搜索数据库的示例。

清单4.使用Python搜索数据库
#!/usr/bin/env python

import sys
import xapian
                                                                                         
try:
    database = xapian.Database('info')

    enquire = xapian.Enquire(database)
                                                                
    query_string = str.join(' ', sys.argv[1:])
                                                        
    qp = xapian.QueryParser()
    stemmer = xapian.Stem("english")
    qp.set_stemmer(stemmer)
    qp.set_database(database)
    qp.set_stemming_strategy(xapian.QueryParser.STEM_SOME)
    query = qp.parse_query(query_string)

    enquire.set_query(query)
    matches = enquire.get_mset(0, 10)
                                                                 
    print "%i results found." % matches.get_matches_estimated()
    print "Results 1-%i:" % matches.size()                                       
                      
    for m in matches:
        print "%i: %i%% docid=%i [%s]" % (m.rank + 1, m.percent, m.docid,
 m.document.get_data())

except Exception, e:
    print >> sys.stderr, "Exception: %s" % str(e)
    sys.exit(1)

您可以使用此命令以与quest命令相同的方式从索引获取结果:

$ simplesearch.py IBM

所有接口都使用相同的基于类的Xapian库接口,因此该过程的基本结构是相同的。 例如,您可以调整以下样本以在WebSphere Web应用程序中使用。 请注意,除了明显的语言差异外,Java结构与Python代码本质上是相同的(请参见清单5)。

清单5.用于搜索数据库的Java代码
import org.xapian.*;
                                                                                  
public class SimpleSearch {
                                                                           
    public static void main(String[] args) throws Exception {
        String dbpath = 'info';                                         
                                                                       
        Query query = new Query(args[0]);
                                                             
        Database db = new Database(dbpath);
              
        Enquire enquire = new Enquire(db);
        enquire.setQuery(query); 
        MSet matches = enquire.getMSet(0, 2500);
        MSetIterator itr = matches.iterator();

        System.err.println("Found " + matches.size() + " matching documents
using " + query);         
        while (itr.hasNext()) {
            itr = (MSetIterator) itr.next();
            Document doc = itr.getDocument();
            System.err.println(itr.getPercent() + "% [" + itr.getDocumentId()
+ "] " + doc.getValue(0\));
        }
    }

}

相同的结构可以与其他界面语言一起使用。

结论

在本文中,您研究了Xapian文本索引系统,该系统通过Omega扩展,可以为各种文档建立索引,然后搜索内容并对其进行报告。 Xapian的灵活性在于通过索引的文本基础,而前端提交系统将二进制文档(PDF,Microsoft Word)转换为文本格式。 您还看到了多种方法,无论是在命令行还是通过不同的语言扩展,都可以从索引中再次获取信息。


翻译自: https://www.ibm.com/developerworks/opensource/library/os-xapianomega/index.html

xapian

 类似资料: