Sphinx全文检索引擎使用指南:建立索引

3.1.数据源

索引的数据可以来自各种各样不同的来源:SQL数据库、纯文本、HTML文件、邮件等等。从Sphinx的视角看,索引数据是一个结构化的文档的集合,其中每个文档是字段的集合,这和SQL数据库的视角有所不同,在那里,每一行代表一个文档,每一列代表一个字段。

由于数据来源的不同,需要不同的代码来获取数据、处理数据以供Sphinx进行索引的建立。这种代码被称之为数据源驱动程序(简称:驱动或数据源)。

在本文撰写时,Sphinx中包括 MySQL和PostgreSQL数据源的驱动程序,这些驱动使用数据库系统提供的C/C++原生接口连接到数据库服务器并获取数据。此外,Sphinx还提供了额外的被成为xmlpipe的数据源驱动,该驱动运行某个具体的命令,并从该命令的输出中读入数据。数据的格式在 3.8, “xmlpipe数据源” 中有介绍。

如果确有必要,一个索引的数据可以来自多个数据源。这些数据将严格按照配置文件中定义的顺序进行处理。所有从这些数据源获取到的文档将被合并,共同产生一个索引,如同他们来源于同一个数据源一样。

3.2.属性

属性是附加在每个文档上的额外的信息(值),可以在搜索的时候用于过滤和排序。

搜索结果通常不仅仅是进行文档的匹配和相关度的排序,经常还需要根据其他与文档相关联的值,对结果进行额外的处理。例如,用户可能需要对新闻检索结果依次按日期和相关度排序,检索特定价格范围内的产品,检索某些特定用户的">blog日志,或者将检索结果按月分组。为了高效地完成上述工作,Sphinx允许给文档附加一些额外的值,并把这些值存储在全文索引中,以便在对全文匹配结果进行过滤、排序或分组时使用。

论坛帖子表是一个很好的例子。假设只有帖子的标题和内容这两个字段需要全文检索,但是有时检索结果需要被限制在某个特定的作者的帖子或者属于某个子论坛的帖子中(也就是说,只检索在SQL表的author_id和forum_id这两个列上有特定值的那些行),或者需要按 post_date列对匹配的结果排序,或者根据post_date列对帖子按月份分组,并对每组中的帖子计数。

为实现这些功能,可以将上述各列(除了标题和内容列)作为属性做索引,之后即可使用 API调用来设置过滤、排序和分组。以下是一个例子:

示例:sphinx.conf片断:

... sql_query = SELECT id, title, content, \

author_id, forum_id, post_date FROM my_forum_posts sql_attr_uint = author_id sql_attr_uint = forum_id sql_attr_timestamp = post_date ...

示例:应用程序代码 (PHP):

// only search posts by author whose ID is 123 $cl->SetFilter ( "author_id", array ( 123 ) );

// only search posts in sub-forums 1, 3 and 7 $cl->SetFilter ( "forum_id", array ( 1,3,7 ) );

// sort found posts by posting date in descending order $cl->SetSortMode ( SPH_SORT_ATTR_DESC, "post_date" );

可以通过名字来指示特定的属性,并且这个名字是大小写无关的(注意:直到目前为止, Sphinx还不支持中文作为属性的名称)。属性并不会被全文索引,他们只是按原封不动的存储在索引文件中。目前支持的属性类型如下:

?无符号整数(1-32位宽)

? UNIX时间戳(timestamps)

?浮点值(32位,IEEE 754单精度)

?字符串叙述 (尤其是计算出的整数值);

? 多值属性 MVA (multi-value attributes)( 32位无符号整形值的变长序列).

由各个文档的全部的属性信息构成了一个集合,它也被称为文档信息(docinfo),docinfo可以按如下两种方式之一存储:

与全文索引数据分开存储(“外部存储”,在.spa文件中存储) ?

在全文索引数据中,每出现一次文档ID就出现相应的文档信息(“内联存储”,在.spd文件中存储).

当采用外部存储方式时,searchd总是在RAM中保持一份.spa文件的拷贝(该文件包含所有文档的所有文档信息)。这是主要是为了提高性能,因为磁盘的随机访问太慢了。相反,内联存储并不需要任何额外的RAM,但代价是索引文件的体积大大地增加了;请注意,全部属性值在文档ID出现的每一处都被复制了一份,而文档ID出现的次数恰是文档中不同关键字的数目。仅当有一个很小的属性集、庞大的数据集和受限的RAM时,内联存储才是一个可考虑的选择。在大多数情况下,外部存储可令建立索引和检索的效率都大幅提高。

检索时采用外部存储方式产生的的内存需求为 (1+number_of_attrs)*number_of_docs*4字节,也就是说,带有两个属性和一个时间戳的1千万篇文档会消耗(1+2+1)*10M*4 = 160 MB的 RAM。这是每个检索的守护进程(daemon)消耗的量,而不是每次查询,searchd仅在启动时分配160MB的内存,读入数据并在不同的查询之间保持这些数据。子进程并不会对这些数据做额外的拷贝。

时间: 2024-10-25 22:19:01

Sphinx全文检索引擎使用指南:建立索引的相关文章

Sphinx全文检索引擎使用指南:索引配置选项

8.2.1. type 索引类型.可选选项,默认值为空(索引为简单本地索引).可用的值包括空字符串或 "distributed" Sphinx支持两种不同的索引类型:本地--在本机上存储和处理,和远程--不仅涉及http://www.aliyun.com/zixun/aggregation/20263.html">本地搜索,而且同时通过网络向远程searchd实力做查询.索引类似选项使您可以选择使用何种索引.索引默认是本地型.指定"distributed&qu

Sphinx全文检索引擎使用指南:简介

1.1.什么是Sphinx Sphinx 是一个在GPLv2 下发布的一个全文检索引擎,商业授权(例如, 嵌入到其他程序中)需要联系我们(Sphinxsearch.com)以获得商业授权. 一般而言,Sphinx是一个独立的搜索引擎,意图为其他应用提供高速.低空间占用.高结果相关度的全文搜索功能.Sphinx可以非常容易的与SQL数据库和脚本语言集成. 当前系统内置MySQL和PostgreSQL数据库数据源的支持,也支持从标准输入读取特定格式的XML数据.通过修改源代码,用户可以自行增加新的数

Sphinx全文检索引擎使用指南:安装

2.1.支持的操作系统 在绝大多数现代的Unix类操作系统上,只需要一个C++编译器就可以编译并运行Sphinx,而不需要对源码进行任何改动. 目前,Sphinx可以在以下系统上运行: ? Linux 2.4.x, 2.6.x (包括各种发行版) ? Windows 2000, XP ? FreeBSD 4.x, 5.x, 6.x ? NetBSD 1.6, 3.0 ? Solaris 9, 11 ? Mac OS X 支持的CPU种类包括 X86, X86-64, SPARC64. 我希望Sp

Sphinx全文检索引擎使用指南:MySQL存储引擎

6.1. SphinxSE概览 SphinxSE是一个可以编译进 MySQL 5.x版本的MySQL存储引擎,它利用了该版本MySQL的插件式体系结构.SphinxSE不能用于 MySQL 4.x系列,它需要MySQL 5.0.22或更高版本:或 MySQL 5.1.12或更高版本. 尽管被称作"存储引擎",SphinxSE自身其实并不存储任何数据.它其实是一个允许 MySQL服务器与searchd交互并获取搜索结果的嵌入式客户端.所有的索引和搜索都发生在 MySQL之外. 显然,Sp

Sphinx全文检索引擎使用指南:搜索

4.1.匹配模式 有如下可选的匹配模式: ? SPH_MATCH_ALL, 匹配所有查询词(默认模式) ? SPH_MATCH_ANY, 匹配查询词中的任意一个 ? SPH_MATCH_PHRASE, 将整个查询看作一个词组,要求按顺序完整匹配 ? SPH_MATCH_BOOLEAN, 将查询看作一个布尔表达式 (参见 节 4.2, "布尔查询语法" ? SPH_MATCH_EXTENDED, 将查询看作一个Sphinx内部查询语言的表达式(参见 节 4.3, " 扩展的查询

Sphinx全文检索引擎使用指南:searchd程序配置选项

8.4.1. address 要绑定的接口 IP地址.可选项,默认为0.0.0.0(即在所有接口上监听). 此设置指定searchd在哪个接口上绑定.监听和接受输入的http://www.aliyun.com/zixun/aggregation/184.5.html">网络连接.默认值为0.0.0.0,意思是在所有接口上监听.目前不能指定多个接口. 示例: address = 192.168.0.1 8.4.2. port searchd的TCP端口号.必选项,默认为3312. 示例: p

Sphinx全文检索引擎使用指南:报告bugs

很不幸,Sphinx还没有达到100%无 bug(尽管我们正向这个目标努力),因此您可能偶尔遇到些问题. 对于每个问题的报告越详细越好,这很重要--因为要想修复 bug,我们必须重现 bug并调试它,或者根据您提供的信息来推断出产生bug的原因.因此在此提供一些如何报告bug的指导. 构建时问题 如果Sphinx构建失败,请您: 1. 确认你的DBMS的头文件和库文件都正确安装了(例如,检查mysql-devel包已经安装) 2. 报告Sphinx的版本和配置文件(别忘了删除数据库连接密码),M

Sphinx全文检索引擎使用指南:API参考

Sphnix有几种不同编程语言的searchd客户端 API的实现.在本文完成之时,我们对我们自己的PHP,Python和java实现提供官方支持.此外,也有一些针对 Perl,http://www.aliyun.com/zixun/aggregation/13430.html">Ruby和C++++的第三方免费.开源API实现. API的参考实现是用PHP写成的,因为(我们相信)较之其他语言,Sphinx在PHP中应用最广泛.因此这份参考文档基于 PHP API的参考,而且这节中的所有的

Sphinx全文检索引擎使用指南:indexer程序配置选项

8.3.1. mem_limit 索引过程内存使用限制.可选选项,默认 32M. 这是indexer不会超越的强制内存限制.可以以字节.千字节(以K为后缀)或兆字节(以 M为后缀)为单位.参见示例.当过小的值导致 I/O缓冲低于 8KB时该限制会自动提高,此值的最低限度依赖于待索引数据的大小.如果缓冲低于 256KB,会产生警告. 最大可能的限制是2047M.太低的值会影响索引速度,但256M到http://www.aliyun.com/zixun/aggregation/12560.html"