sphinx 0.9.9







Sphinx 全文检索服务器 0.9.9 参考手册


文档版本:v0.9
















刘光照 2009-11-23

目录

内容目录

1.简介 6

1.1.什么是Sphinx 6

1.2.Sphinx特性 6

1.3.如何获得Sphinx 7

1.4.许可协议 7

1.5.作者和贡献者 7

1.6.历史 8

2.安装 8

2.1.支持的操作系统 8

2.2.依赖的工具 9

2.3.安装Sphinx 9

2.4.Installing Sphinx on Windows 10

2.5.已知的问题和解决办法 11

2.6.Sphinx 快速入门教程 11

3.建立索引 12

3.1.数据源 12

3.2.属性 13

3.3.多值属性MVA (multi-valued attributes) 15

3.4.索引 15

3.5.数据源的限制 16

3.6.字符集、大小写转换和转换表 16

3.7.SQL数据源(MySQL, PostgreSQL) 17

3.8.Xmlpipe数据源 18

3.9.xmlpipe2数据源 19

3.10.实时索引更新 21

3.11.索引合并 23

4.搜索 24

4.1.匹配模式 24

4.2.布尔查询 25

4.3.扩展查询 25

4.4.权值计算 29

4.5.排序模式 30

4.6.结果分组(聚类) 35

4.7.分布式搜索 36

4.8.Searchd日志格式 38

4.9.MySQL 协议支持和SphinxQL 39

5.命令行工具手册 47

5.1.search命令参考 47

6.API参考手册 52

6.1.通用API函数 52

6.1.1.GetLastError 52

6.1.2.GetLastWarning 53

6.1.3.SetServer 53

6.1.4.SetRetries 53

6.1.5.SetConnectTimeout 53

6.1.6.SetArrayResult 54

6.1.7.IsConnectError 54

6.2.通用搜索设置 55

6.2.1.SetLimits 55

6.2.2.SetMaxQueryTime 55

6.2.3.SetOverride 56

6.2.4.SetSelect 56

6.3.全文搜索设置 58

6.3.1.SetMatchMode 58

6.3.2.SetRankingMode 58

6.3.3.SetSortMode 59

6.3.4.SetWeights 59

6.3.5.SetFieldWeights 59

6.3.6.SetIndexWeights 60

6.4.结果集过滤设置 60

6.4.1.SetIDRange 60

6.4.2.SetFilter 61

6.4.3.SetFilterRange 61

6.4.4.SetFilterFloatRange 61

6.4.5.SetGeoAnchor 61

6.5.GROUP BY 设置 62

6.5.1.SetGroupBy 62

6.5.2.SetGroupDistinct 62

6.6.Querying 63

6.6.1.Query 63

6.6.2.AddQuery 64

6.6.3.RunQueries 66

6.6.4.ResetFilters 66

6.6.5.ResetGroupBy 67

6.7.额外的功能 67

6.7.1.BuildExcerpts 67

6.7.2.UpdateAttributes 68

6.7.3.BuildKeywords 68

6.7.4.EscapingString 69

6.7.5.Status 69

6.8.持久连接(长连接) 70

6.8.1.Open 70

6.8.2.Close 70

7.MySQL存储引擎(SphinxSE) 70

8.报告 bugs 70

9.sphinx.conf选项参考 70

9.1.Data Source配置选项 70

9.1.1.type 70

9.2.索引文件配置选项 71

9.2.1.path 71

9.3.indexer索引器程序配置选项 71

9.3.1.mem_limit 71

9.3.2.max_iops 72

9.3.3.max_iosize 72

9.3.4.max_xmlpipe2_field 73

9.3.5.write_buffer 73

9.4.Searchd程序配置选项 73

10.Sphinx版本历史 73

11.错误代号列表 73

11.1.Indexer 73

11.2.searchd 74

12.常见问题说明 74


1.简介

1.1.什么是Sphinx

Sphinx 是一个在GPLv2 下发布的一个全文检索引擎,商业授权(例如, 嵌入到其他程序中)需要联系我们(Sphinxsearch.com)以获得商业授权。

一般而言,Sphinx是一个独立的搜索引擎,意图为其他应用提供高速、低空间占用、高结果相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。

当前系统内置MySQLPostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式的XML数据。通过修改源代码,用户可以自行增加新的数据源(例如:其他类型的DBMS

的原生支持)。

搜索API支持PHPPythonPerlRudyJava,并且也可以用作MySQL存储引擎。搜索

API非常简单,可以在若干个小时之内移植到新的语言上。

Sphinx SQL Phrase Index的缩写,但不幸的和CMUSphinx项目重名。


1.2.Sphinx特性


1.3.如何获得Sphinx

Sphinx 可以从网站http://www.sphinxsearch.com/

目前,Sphinx的发布包包括如下软件:


1.4.许可协议

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See COPYING file for details.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

If you don't want to be bound by GNU GPL terms (for instance, if you would like to embed Sphinx in your software, but would not like to disclose its source code), please contact the author to obtain a commercial license.

1.5.作者和贡献者

作者

Sphinx 最初作者和目前的要开发人员:

贡献者

Sphinx的开发人员和他们的贡献如下(以下排名不分先后:

外,还有许多出了宝贵法、错误报告以。在一并致谢


1.6.历史

Sphinx 的开发工作可以上2001,当时作者试图为一个数据库驱动网站寻找一个可

的搜索的解决方,但是当时没有任何方够满足实上,要是如下问题:

去年Sphinx的用户给了正面反馈因此而易的,Sphinx的开发过程将会继

(也许世界末日)。


2.安装

2.1.支持的操作系统

大多数代的Unix类操作系统上,需要一个C++编译器可以编译并Sphinx而不需要源码何改

目前,Sphinx可以在以下系统上:

支持的CPU包括X86, X86-64, SPARC64

我希望Sphinx也能在其他的Unix平台上工作,如果你运Sphinx使用的操作系统不在上的名单中,请告我。

目前的阶段SphinxWindows版可用测试和试,但不建议用系统。最突出个问题是:1缺少并发查询的支持2缺少索引数据热切换的支持。虽然目前已经有成功的生产环境克了这两个问题,仍然推荐WindowsSphinx提供高度的搜索服务。


2.2.依赖的工具

UNIX平台上,需要以下的工具用编译和安装Sphinx:

Windows平台上,需要Microsoft Visual C/C++ Studio .NET 2003 or 2005。其他的编译器/开发环境也许也能,但可能需要自手工制作他们需的Makefile者工程文件。


2.3.安装Sphinx

1. 将你tar,并sphinx 目录:

$ tar xzvf sphinx-0.9.7.tar.gz

$ cd sphinx

2. configuration 程序:

$ ./configure

configure程序有很行选项。完整表可以通过使用 --help 开关得到。重要的如下:

3. 编译二进制程序:

$ make

4. 按照二进制程序到的目录下:(*nix系统默认安装到 /usr/local/bin/ ,但是可以通过configure --prefix参数指定其他安装路径)

$ make install


2.4.Installing Sphinx on Windows


Installing Sphinx on a Windows server is often easier than installing on a Linux environment; unless you are preparing code patches, you can use the pre-compiled binary files from the Downloads area on the website.


Extract everything from the .zip file you have downloaded - sphinx-0.9.8-win32.zip (or sphinx-0.9.8-win32-pgsql.zip if you need PostgresSQL support as well.) You can use Windows Explorer in Windows XP and up to extract the files, or a freeware package like 7Zip to open the archive.


For the remainder of this guide, we will assume that the folders are unzipped into C:\Sphinx, such that searchd.exe can be found in C:\Sphinx\bin\searchd.exe. If you decide to use any different location for the folders or configuration file, please change it accordingly.


Install the searchd system as a Windows service:


C:\Sphinx> C:\Sphinx\searchd --install --config C:\Sphinx\sphinx.conf --servicename SphinxSearch


The searchd service will now be listed in the Services panel within the Management Console, available from Administrative Tools. It will not have been started, as you will need to configure it and build your indexes with indexer before starting the service. A guide to do this can be found under Quick tour.


2.5.已知的问题和解决办法

如果configure 程序没有找MySQL 文件和库文件,请试图检查 mysql-devel

安装。在有些系统上,默认安装包括这

如果make程序给出如下错误

/bin/sh: g++: command not found

make[1]: *** [libsphinx_a-sphinx.o] Error 127

请检查gcc-c++ 安装

如果在编译时得到如下错误

sphinx.cpp:67: error: invalid application of `sizeof' to

incomplete type `Private::SizeError<false>'

味着某些编译时的类型检查失败了,一个最有可能的原是在的系统上类型off_t度小64bit。一个快速的修是,可以修改sphinx.h 在定类型SphOffset_toff_t 换成DWORD,需要意,这种动将使的全文索引文件不能2GB即便这种修改用,也请一问题,在报中请包括错误信息操作系统编译器的配置情况这样,我可能能在下一个版本中解决一问题。

如何你遇其他的何问题,者前的建议对你没有帮助别犹豫,请立联系我。


2.6.Sphinx 快速入门教程

以下所有的例子都假你将sphinx安装在目录 /usr/local/sphinx 中了,那么searchd的路径为/usr/local/bin/searchd

使用Sphinx需要:

1. 建配置文件

缺省的配置文件名为sphinx.conf。全部的Sphinx提供的程序默认都在当前工作的目录下寻找该文件。

configure 程序生成的示例配置文件sphinx.conf.dist 中包括全部选项的注释,复制并编辑这个文件使之适用于你的具体情况:

$ cd /usr/local/sphinx/etc

$ cp sphinx.conf.dist sphinx.conf

$ vi sphinx.conf

示例配置文件中,试图MySQL数据库test中的documents 表建立索引

因此这里还提供example.sql 于给测试表增加数据用测试:

$ mysql -u test < /usr/local/sphinx/etc/example.sql

2. indexer 的全文索引:

$ cd /usr/local/sphinx/etc

$ /usr/local/sphinx/bin/indexer

3. 检索建的索引

可以使用search实用程序可以从命令索引行检索:

$ cd /usr/local/sphinx/etc

$ /usr/local/sphinx/bin/search test

如果要从PHP脚本检索索引,需要:

1. 守护进searchdPHP脚本需要接到searchd行检索 :

$ cd /usr/local/sphinx/etc

$ /usr/local/sphinx/bin/searchd

2. PHP API 附带test 脚本(行之前请确认searchd守护进程已启动):

$ cd sphinx/api

$ php test.php test

3. API文件(位于api/sphinxapi.php) 包含进你的脚本,开编程。

搜索


3.建立索引

3.1.数据源

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

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

在本文写时,Sphinx包括MySQLPostgreSQL数据源的驱动程序,这些驱动使用数据库系统提供的C/C++原生接口连接到数据库服务器并获取数据。外,Sphinx提供额外的成为xmlpipe的数据源驱动该驱动运个具命令,并从该命令的输中读入数据。数据的格式在 3.8, “xmlpipe 数据源

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


3.2.属性

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

搜索结果通常不仅仅行文档的匹配和相关度的排序,需要据其他与文档相关联

的值,结果行额外的处理。例如,用户可能需要检索结果依按日和相关度排

序,检索特定范围内的产品,检索某些特定用户的blog日志,检索结果按

组。为成上工作,Sphinx文档加一额外的值,并把这些值存储在全

文索引中,以便全文匹配结果行过滤、排序分组时使用。


属性与字段不同的是它不做全文索引。它们存储在索引中,但不能像全文检索一样搜索它们,如果这么做会导致错误结果。Attributes, unlike the fields, are not full-text indexed. They are stored in the index, but it is not possible to search them as full-text, and attempting to do so results in an error.


For example, it is impossible to use the extended matching mode expression @column 1 to match documents where column is 1, if column is an attribute, and this is still true even if the numeric digits are normally indexed.


属性可用于过滤,也就是说,确定返回的行,就像排序或结果集分组一样。可以完全基于属性排序结果集,并忽略搜索的关联工具。另外,属性还会从search守护进程返回,但索引的文本不会返回。Attributes can be used for filtering, though, to restrict returned rows, as well as sorting or result grouping; it is entirely possible to sort results purely based on attributes, and ignore the search relevance tools. Additionally, attributes are returned from the search daemon, while the indexed text is not.


论坛帖子表是一个很好的例只有帖子的标题和内容这两个字需要全文检索,但是时检索结果需要限制在个特定的作者的帖子或者属于某子论坛帖子中(也检索在SQL表的author_idforum_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_datepp

...

例: 应用程序代码 (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不支持中文作为属性的名)。属性并不会被全文索引,他们是按原的存

储在索引文件中。目前支持的属性类型如下:

由各个文档的全的属性信息构一个集合,被称为文档信息docinfo),docinfo

可以按如下两种方式之一存储:

用外存储方式时,searchd是在RAM持一.spa文件的拷贝文件包含所有文档的所有文档信息)。要是为提高性能,磁盘访太慢。相,内联存储并不需要何额外的RAM,但代是索引文件的大大地增加了;意,全

属性值在文档ID出现处都被复,而文档ID出现是文档中不

字的数目。一个小的属性集、大的数据集和限的RAM时,内联存储是一个

可考的选。在大多数情况下,外存储可建立索引和检索的提高。

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


3.3.多值属性MVA (multi-valued attributes)

多值属性MVA (multi-valued attributes)是文档属性的一重要的特例,MVA使得文档加一系的值作为属性的法成为可能。这对tags产品别等等非常用。MVA属性支持过滤和分组(但不支持分组排序)。

目前MVA表项的值限制为32数。表的度不限制,有足够

RAM意个数的值可以被附加到文档上(包含MVA值的.spm文件会被searchd预缓冲

RAM中)。源数据可以自一个单独的查询,也可以自文档属性,参考

sql_attr_multi 中的源类型。在种情况中,查询须返回文档IDMVA值的序对;而在

二种情况中,段被型值。对于多值属性的输入数据的没有任何限制,在

索引过程中这些按文档ID分组(而相文档ID下的数据也排序)。

在过滤过程中,MVA属性中的何一个值满足过滤件,文档与过滤件匹配(因此通过排他性过滤的文档不会包含任的值)。按MVA属性分组时,一文档会被分到

与多个不MVA应的多个组。例如,如果文档集只包含文档,一个叫做tag

MVA属性,属性的值是5711么按tag的分组操作会产个组,们的

@count1@groupby值分5711意,按MVA分组可能结果

集中的文档:每篇文文档可能属的组,而且可能在多个组中选为

结果,这会ID由于历史原PHP API结果集的行行按文档ID

hash因此PHP APIMVA属性的分组操作时你还需要使用 SetArrayResult()


3.4.索引

快速地响应查询,Sphinx需要从文本数据中建立一为查询优化的特的数据结这种数据结构被称为索引(index而建立索引的过程也叫做索引建立索引(indexing)。

的索引类型是为不务设计的。如,基于磁盘B-Tree存储结的索引可以更新比较简单(容易的索引入新的文档),但是搜来就相当因此Sphinx

的程序构允许实类型的索引。

目前在Sphinx中实一一索引类型是为最优化建立索引和检索的速度而设计的。之而的代是更新索引相当的理论,更新这种索引甚至可能重建索引。不过大多数情况可以建立多个索引解决索引更新的问题,细节请参考 3.10, “ 实时索引更新 更多的索引类型支持,已入计,其中包括可以实时更新的类型。

个配置文件可以按需配置足够多的索引。indexer 工具可以时重新索引

(如果使用--all选项)更新明确指出的一个。 Searchd工具所有被指明

的索引提供检索服务,而可以在行时定使用那些索引行检索。


3.5.数据源的限制

Sphinx索引的源数据限制,其中重要的一是:

所有文档的ID一的数(Sphinx构建时的选项,可能是32位或64

如果不满足这个要各种糟糕情况都可能发生。例如,Sphinx建立索引时可能在突然崩溃由于的文档ID而在索引结果中奇怪的结果。也可能,一1000猩猩最后出你电脑扔木桶。我告诉你


3.6.字符集、大小写转换和转换表

当建立索引时,Sphinx定的数据源获得文本文档,文本分成的集合,对每大小写转换,Abc”ABC”abc”都被当作一个word者更

term)。

了正确完成上工作,Sphinx需要知

这些都可以用charset_type charset_table 选项为个索引单独配置。 charset_type 定文档的编码是单字节的(SBCSUTF-8的。charset_table 类字符到们的大小写转换版本的应表,没有表中出现的字符被认为是非字类字符,并且在建立索引和检索时当作的分来看

意,尽管默认的转换表并不包含空格符 (ASCII 0x20, Unicode U+0020),但全合法的。某些情况下可能用,如在tag构造索引的时这样一个用空格分开的可以当作一个单独的查询项

默认转换表目前包括文和文字符。请您提您为其他语言写的转换表


3.7.SQL数据源(MySQL, PostgreSQL)

对于所有SQL驱动,建立索引的过程如下:

大多数参数是的,例如数据库的用户名、主机码。不过,还有细节上的问题需要


分区查询


Sphinx需要通过查询获取全的文档信息,一简单的实将整个表的数据读入内存,但是可能致整个表定并使得其他操作(例如:在MyISAM格式上的INSERT操作),时,浪费内存用存储查询结果,类的问题。为避免出现这种情况Sphinx支持一种被称分区查询的技术。Sphinx从数据库中取文档ID小值和大值,将由最大值和小值定数区间分成若干,一获取数据,建立索引。例如下:

1. 使用分区查询的例

# in sphinx.conf

sql_query_range = SELECT MIN(id),MAX(id) FROM documents

sql_range_step = 1000

sql_query = SELECT * FROM documents WHERE id>=$start AND id<=$end

如果个表(documents)中,字ID小值和大值分1 2345sql_query3

1. $start 换为1 ,并且$end 换为1000;

2. $start 换为1001 ,并且$end 换为2000;

3. $start 换为2000 ,并且$end 换为2345.


显然这对于只有2000行的表,分区查询与个读入没有大区,但是当表的模扩大到千万级(特对于MyISAM格式的表),分区查询提供一些帮助


后查询(sql_postvs. 索引查询(sql_post_index


查询和索引查询的区,当Sphinx获取到全文档数据,立查询,但是建索引的过程仍然可能某种因失败。在一方,当索引查询行时,可以理所为索引已成功构造完了构造索引可能是个的过程,因此对与数据库的接在索引操作后被,在行索引操作前开。


3.8.Xmlpipe数据源

xmlpipe 数据源是处于让用户能够将现有数据嵌入Sphinx需开发新的数据源驱动的目的设计和提供的。将每篇文档限制为包括两个可全文索引的字,以及只包括两个属性。xmlpipe数据源已经被废弃,在 3.9, “xmlpipe2 数据源述了xmlpipexmlpipe2数据源。对于新的数据,建议xmlpipe2.

使用xmlpipe,需要配置文件改为类如下的样子

source example_xmlpipe_source

{

type = xmlpipe

xmlpipe_command = perl /www/mysite.com/bin/sphinxpipe.pl

}

indexer 实用程序xmlpipe_command 所指定的命令,而读取其标准输

的数据,并行解并建立索引。格的,是Sphinx一个与命令

管道,并从管道读取数据。

indexer 实用程序定在从标准输入读入的XML格式的数据中中存在一个更多的文档。下是一个包括两个文档的文档数据的例

Example 2. XMLpipe 文档数据

<document>

<id>123</id>

<group>45</group>

<timestamp>1132223498</timestamp>

<title>test title</title>

<body>

this is my document body

</body>

</document>

<document>

<id>124</id>

<group>46</group>

<timestamp>1132223498</timestamp>

<title>another test</title>

<body>

this is another document

</body>

</document>

遗留xmlpipe遗留的数据驱动使用内置的解xml文档,个解器的速度非常快,但是并没有提供XML格式完整支持。个解器需要文档中包括的字,并

格按照例给出的格式给出,而且字出现顺序需要格按照例给出序。

仅有一个字timestamp是可选的,缺省值为1


3.9.xmlpipe2数据源

xmlpipe2使可以用自定XML格式Sphinx意文本数据和属性数据。数据模式(数据字的集合者属性集)可以XML定,也可以在配置文件中数据源的配置分中定。


Xmlpipe2

xmlpipe2数据源索引时,索引器定的命令开一个接前述命令标准输管道,并有正确格式的XML数据。以下是一个数据本:

3 xmlpipe2文档

<?xml version="1.0" encoding="utf-8"?>

<sphinx:docset>

<sphinx:schema>

<sphinx:field name="subject"/>

<sphinx:field name="content"/>

<sphinx:attr name="published" type="timestamp"/>

<sphinx:attr name="author_id" type="int" bits="16" default="1"/>

</sphinx:schema>

<sphinx:document id="1234">

<content>this is the main content <![CDATA[[and this <cdata> entry must be

handled properly by xml parser lib]]></content>

<published>1012325463</published>

<subject>note how field/attr tags can be in <b class="red">randomized</b>

order</subject>

<misc>some undeclared element</misc>

</sphinx:document>

<!-- ... more documents here ... -->

</sphinx:docset>

意多的数据字和属性许的。数据字和属性在一文档元素出现先后顺没有。。单一字数据的限制,2MB的数据会被2MB(但个限制可以在配置文件中数据源分修改)


数据模式,数据字和属性的完整列表,何文档之前就确定。可以在配置文件中用xmlpipe_fieldxmlpipe_attr_xxx选项定,也可以在数据中用

<sphinx:schema>元素定。 <sphinx:schema>元素是可选的,但如果出现就必

<sphinx:docset>元素一个元素。如果没有在数据中内嵌的数据模式定,配置文件中的相关设置就会数据内嵌的设置被优先用。

知类型的标不是数据字,也不是属性的标会被忽略,但会给出告。在上的例中,<misc>会被忽略所有嵌入在其他标中的标其属性都会被(例如上中嵌入在<subject>中的<b>

支持输入数据的何字符编码取决系统中是安装iconvxmlpipe2是用libexpat器解的,器内置US-ASCIIISO-8859-1UTF-8和一UTF-16的支持。

Sphinxconfigure脚本也检查libiconv存在并使用来处理其他的字符编码。

libexpat的要Sphinx使用UTF-8它返回的分过的数据UTF-8的。

xmlpipe2可以XML元素(标)(以元素可用的属性)如下:

sphinx:docset

顶级元素,用包括xmlpipe2文档。

Sphinx:schema

可选元素要么是sphinx:docset一个元素,要么干出现文档的模

式。包括数据字和属性的。若元素出现则它覆盖配置文件中数据源的

设定。

Sphinx:field

可选元素sphinx:schema元素一个全文数据字一可的属性是

name”的名后续数据文档中具有此元素的数据都被当作

检索的全文数据

sphinx:attr

可选元素sphinx:schema元素。用属性。其已知的属性

● “name”,设定属性名后续文档中具有该元素当作一个属性

● ”type”,设定属性的类型。可能的类型包括

int”timestamp”str2ordinal”bool”float”

● “bits”,设定int”型属性的度,有效值为132

● “default”,设定属性的默认值,若后续文档中没有指个属性,使用

默认值。

Sphinx:document

出现元素sphinx:docset元素包含任意多的其他元素这些子

带有索引的数据字和属性值,而这些数据字段或属性值可以是用sphinx:field

sphinx:attr元素声的,也可以在配置文件中一的已知属性是id”

包含一个一的型的文档ID



3.10.实时索引更新

有这么一情况个数据集非常大,以于经常性的重建索引,但是每次新增相当地。一个型的例是:一个论坛有1000000个已档的帖子,但只有1000个新帖子

这种情况下可以用“主索引索引main+delta)模式现“实时

索引更新。

这种方法的基本思路是设置个数据源和个索引,对很少更新或根本不更新的数据建索引,而新增文档建立增索引。在上中,1000000个已档的帖子索引中,而新增的1000帖子则放在增索引中。增索引更新的频率可以非常快,而文档可以在出现可以检索到。

定具体某一文档的分属个索引的分类工作可以自动完成。一个可选的方是,建立一个计数表,文档集分成分的个文档ID,而每次重新索引时,个表都会被更新。

4 全自时更新

# in MySQL

CREATE TABLE sph_counter

(

counter_id INTEGER PRIMARY KEY NOT NULL,

max_doc_id INTEGER NOT NULL

);

# in sphinx.conf

source main

{

# ...

sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents

sql_query = SELECT id, title, body FROM documents \

WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )

}

source delta : main

{

sql_query_pre =

sql_query = SELECT id, title, body FROM documents \

WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )

}

index main

{

source = main

path = /path/to/main

# ... all the other settings

}

# note how all other settings are copied from main,

# but source and path are overridden (they MUST be)

index delta : main

{

source = delta

path = /path/to/delta

}


注意我们如何覆写增量数据源中我sql_query_pre。这必须显式覆写它。否则REPLACE查询会创建增量索引时再次执行,。然而,当我们在继承的数据源是第一次指定这个指令时,它会删除所有继承来的值,因此编码设置也丢失了。所以增量数据源中的sql_query_pre不能置空,我们必须再次显式指定查询编码。Note how we're overriding sql_query_pre in the delta source. We need to explicitly have that override. Otherwise REPLACE query would be run when indexing delta source too, effectively nullifying it. However, when we issue the directive in the inherited source for the first time, it removes all inherited values, so the encoding setup is also lost. So sql_query_pre in the delta can not just be empty; and we need to issue the encoding setup query explicitly once again.


3.11.索引合并

合并个已的索引重新对所有数据索引更有效,而且候必这样(例如在“主索引索引分区模式中应合并索引和增索引,而不是简单地重新索引“主索引

应的数据)。因此indexer有这个选项。合并索引一般重新索引快,但在大型索引上

不是一。基本上,合并的个索引都会被读入内存一,而合并的内容需要写

磁盘。例如,合并100GB1GB个索引202GBIO操作(但可能

重新索引

基本的命令语法如下:

indexer --merge DSTINDEX SRCINDEX [--rotate]

SRCINDEX的内容合并到DSTINDEX中,因此只有DSTINDEX索引会被。若

DSTINDEX经被searchd提供服务,--rotate参数是的。最初设计的使用模式是,

的更新从SRCINDEX合并到DSTINDEX中。因此,当属性合并时,一出现了

的文档IDSRCINDEX中的属性值更优先覆盖DSTINDEX中的值)。不过要意,

字并不会被删除。例如,在DSTINDEX一个叫做old”的关字与文

123相关联,而在SRCINDEXnew”一个文档相关,么在合并

这两个关到文档123。您可以给出一个来将文档从DSTINDEX中移

便对这种情况,相关的开关是--merge-dst-range:

indexer --merge main delta --merge-dst-range deleted 0 0

个开关许您在合并过程中目标索引实过滤。过滤器可以多个,只有满足过滤件的文档合并的索引中出现。在上中,过滤器只允deleted”0那些件通过,而所有为已删除deleted”)的录(可以通过UpdateAttributes() 设置文档的属性)。


4.搜索

4.1.匹配模式

如下可选的匹配模式:


还有一个特“完整扫描(SPH_MATCH_FULLSCAN)模式,当满足如下件时,模式

1. 查询是空的(即长度为

2. docinfo 存储方式为extern

完全扫描模式中,全已索引的文档都被看作是匹配的。类匹配仍然会被过滤、排序分组,但是并不的全文检索。这种模式可以用统一全文检索和非全文检索的代码,减轻SQL服务器的负担有些Sphinx扫描的速度要优于MySQL

询).An example of using the full scan mode might be to find posts in a forum. By selecting the forum's user ID via SetFilter() but not actually providing any search text, Sphinx will match every document (i.e. every post) where SetFilter() would match - in this case providing every post from that user. By default this will be ordered by relevancy, followed by Sphinx document ID in ascending order (earliest first).使用完全扫描的一个例子是找到一个论坛里的帖子数。通过SetFilter()函数但不提供任何搜索文本查询论坛的用户IDSphinx会匹配每个SetFilter()匹配的文档(如,每个帖子)-这种情况下提供的是这个用户的所有帖子。默认情况下将按照关联度排序,还有Sphinx文档ID的升序排列(早的在前)。


4.2.布尔查询

布尔查询许使用下操作符:

hello & world

hello | world

hello -world

hello !world

( hello world )

以下是一个使用如上全操作符的例

5 布尔查询

( cat -dog ) | ( cat -mouse)

(AND)操作符为默认操作,hello world”其实hello & world”

(OR)操作符的优先与操作符,因此“lookingfor cat | dog | mouse”"looking for (cat | dog | mouse )" 而不是 "(looking for cat) | dog | mouse"

-dog”这种查询不能行,它差不多包括索引所有文档。技术上的原

性能上的原。从技术上Sphinx并不持一个全文档ID表。性能方

当文档集非常大的时10-100M个文档),对这种行查询可能需要很长的时间。


4.3.扩展查询

The following special operators and modifiers can be used when using the extended matching mode: 下面的特殊操作符和修饰符可用于扩展匹配模式:

hello | world

hello -world

hello !world

@title hello @body world

@body[50] hello

@(title,body) hello world

@* hello

"hello world"

"hello world"~10

"the world is a wonderful place"/3

aaa << bbb << ccc

raining =cats and =dogs

^hello world$


这有一个使用了这些操作符的查询:Here's an example query that uses some of these operators:


示例 6. 扩展查询模式:查询示例 Extended matching mode: query example

"hello world" @title "example program"~5 @body python -(php|perl) @* code


The full meaning of this search is: 完整的搜索意义是:



There always is implicit AND operator, so "hello world" means that both "hello" and "world" must be present in matching document. 实际上这还有隐式的AND操作符,那么”hello world” 的意思是”hello”和”world”两者必须都在匹配的文档中出现。


OR)操作符的优先级要高与操作符,因此"looking for cat | dog | mouse" "looking for ( cat | dog | mouse )" 而不是"(looking for cat) | dog | mouse"


Field limit operator limits subsequent searching to a given field. Normally, query will fail with an error message if given field name does not exist in the searched index. However, that can be suppressed by specifying "@@relaxed" option at the very beginning of the query:

@@relaxed @nosuchfield my query


This can be helpful when searching through heterogeneous indexes with different schemas.


Field position limit, introduced in version 0.9.9-rc1, additionaly restricts the searching to first N position within given field (or fields). For example, "@body[50] hello" will not match the documents where the keyword 'hello' occurs at position 51 and below in the body.


近似距离为单随词变化变化,并应用中的全部词个例"cat dogmouse"~5 个查询的意一个少于8包含,也"CAT aaa bbb ccc DOG eee fff MOUSE" 个文档不匹配个查询,正好8


值匹配符引入匹配。它允至少含有某值数个匹配的文档通过。上"the world is a wonderful place"/3匹配含有指定的中的个的那些文档。


Strict order operator (aka operator "before"), introduced in version 0.9.9-rc2, will match the document only if its argument keywords occur in the document exactly in the query order. For instance, "black << cat" query (without quotes) will match the document "black and white cat" but not the "that cat was black" document. Order operator has the lowest priority. It can be applied both to just keywords and more complex expressions, ie. this is a valid query: 0.9.9-rc2引入 的严格顺序操作符(亦称”before”操作符)仅会匹配包含参数关键词,并且严格按照查询的顺序出现的文档。例如,”black << cat”查询(不包括引号)会匹配文档"black and white cat" ,但不会匹配"that cat was black"。顺序操作符优先级最低。它既可用于单词,也可用于更复杂的表达式,如,有这么个有效的查询:

(bag of words) << "exact phrase" << red|green|blue


Exact form keyword modifier, introduced in version 0.9.9-rc1, will match the document only if the keyword occurred in exactly the specified form. The default behaviour is to match the document if the stemmed keyword matches. For instance, "runs" query will match both the document that contains "runs" and the document that contains "running", because both forms stem to just "run" - while "=runs" query will only match the first document. Exact form operator requires index_exact_words option to be enabled. This is a modifier that affects the keyword and thus can be used within operators such as phrase, proximity, and quorum operators. 0.9.9-rc1引入的精确形式关键字修饰符仅会匹配那些出现精确指定的形式的文档。默认匹配行为是匹配词根关键字的文档。例如,”runs”查询会匹配包含”runs”的文档和包含”running”的文档,因为这两种形式只是”run”词根的不同形式,而”=runs”查询仅会匹配第一个文档。精确形式操作符需要开启 index_exact_words选项。这是一个影响 关键字的修饰符,所以可用于phrase,proximityquorum操作符中。


Field-start and field-end keyword modifiers, introduced in version 0.9.9-rc2, will make the keyword match only if it occurred at the very start or the very end of a fulltext field, respectively. For instance, the query "^hello world$" (with quotes and thus combining phrase operator and start/end modifiers) will only match documents that contain at least one field that has exactly these two keywords. 0.9.9-rc2引入的字段开始和字段结束关键字修饰符匹配全文检索字段的开关或者结尾的文档。例如,查询"^hello world$"(带引号,这样是phrase操作符与开始/结束修饰符的组合)仅匹配至少有一个字段精确包含这两个关键字的文档。


自从0.9.9-rc1开始支持任意嵌套的括号和否操作。然而,该查询必须在不调用隐式文档静静的情况下能计算出来:Starting with 0.9.9-rc1, arbitrarily nested brackets and negations are allowed. However, the query must be possible to compute without involving an implicit list of all documents:

// correct query 正确的查询

aaa -(bbb -(ccc ddd))


// queries that are non-computable 不可计算的查询

-aaa

aaa | -bbb


4.4.权值计算

用何权值计算数(目前)取决查询的模式。

这是权值计算函数中使用到的主要部分:

1.

2. 统计

据文档和查询的最长共子LCSlongest common subsequence)的行。

因此如果文档查询一个匹配(文档直接包含该词组),取得可能的大值,也是查询中的个数。

统计分基于经BM25数,。如果某词个数据库中很少见文档集上的低者在个特定文档中被经常提特定文档上的高),得到一个高的权重。BM25权值是一个01之间的数。

所有模式中,数据字分是LCS以用户定的数据字权值。数据字权值是数,默认1,且字的权值不小1

SPH_MATCH_BOOLEAN模式中,不何权重计,一个匹配项的权重1

SPH_MATCH_ALLSPH_MATCH_PHRASE模式中,的权值是分的加权和。

SPH_MATCH_ANY模式中,面述两模式的基本个数据字的权重加上一个匹配数目。在之前,权的组相关度额外以一个足够大的数,以便确何一个分的数据字段都会使个匹配的相关度高,使数据字的权重比较低。

SPH_MATCH_EXTENDED模式中,的权值是权的分和BM25权重的和,

1000四舍五入到数。

个行为将会被修改,以便使MATCH_ALLMATCH_ANY这两个模式也能使用BM25

法。这将使分相的搜索结果片断得到改只有一个的查询中用。

对于布尔模式以外的全模式中)是子词组的匹配则评高,

配(匹配组)高。作者的是,这种于词组相性的分方法可以提供

何单的统计模型(如其他搜索引擎中广泛使用的BM25明显更高的搜索质量


4.5.排序模式

可使用如下模式搜索结果排序:



SPH_SORT_RELEVANCE忽略加的参数,永远按相关度分排序。所有的模式额外的排序的语法的模式关。SPH_SORT_ATTR_ASC, SPH_SORT_ATTR_DESCSPH_SORT_TIME_SEGMENTS个模式一个属性名。

SPH_SORT_RELEVANCE模式等价于在扩展模式中按"@weight DESC, @id ASC"排序,

SPH_SORT_ATTR_ASC 模式等价于"attribute ASC, @weight DESC, @id ASC",而

SPH_SORT_ATTR_DESC 等价于"attribute DESC, @weight DESC, @id ASC"


SPH_SORT_TIME_SEGMENTS模式

SPH_SORT_TIME_SEGMENTS模式中,属性值时间段”然后先按时间

序,按相关度排序。

时间据搜索发生时的当前时间计算的,因此结果时间而所说的时间段有如下这些值:

时间的分法在搜索程序中,但如果需要,也可以比较容易地改(需要修改源码)。

这种模式是为便对Blog日志和新提要的搜索而增加的。使用个模式时,处于时间排在前,但是在一时间中的据相关度排序同于按时间排序而不考相关度。



SPH_SORT_EXTENDED 模式


SPH_SORT_EXTENDED 模式中,您可以定一个类SQL的排序表式,但的属

性(包括属性)不能5个,例如:

@relevance DESC, price ASC, @id DESC


相关设置,不是内属性(引擎计算出来那些属性)是用户定的属性就都可以使用。内属性的名字用特@,用户属性按原使用。在上的例子里@relevance@id是内属性,而price是用户定属性。


已知的内属性:

@id (match ID)

@weight (match weight)

@rank (match weight)

@relevance (match weight)

@random (return results in random order)


@rank@relevance@weight的额外名。


SPH_SORT_EXPR 模式


式排序模式使您可以匹配项按何算术表式排序,表式中的项可以是属性值,内属性(@id@weight),算术算符和一内建的数。例如:

$cl->SetSortMode ( SPH_SORT_EXPR,

"@weight + ( user_karma + ln(pageviews) )*0.1" );


支持的算符和数如下。们是模仿MySQL设计的。数接参数,参数的数目据具数的不而不



Calculations can be performed in three different modes: (a) using single-precision, 32-bit IEEE 754 floating point values (the default), (b) using signed 32-bit integers, (c) using 64-bit signed integers. The expression parser will automatically switch to integer mode if there are no operations the result in a floating point value. Otherwise, it will use the default floating point mode. For instance, "a+b" will be computed using 32-bit integers if both arguments are 32-bit integers; or using 64-bit integers if both arguments are integers but one of them is 64-bit; or in floats otherwise. However, "a/b" or "sqrt(a)" will always be computed in floats, because these operations return non-integer result. To avoid the first, you can use IDIV(). Also, "a*b" will not be automatically promoted to 64-bit when the arguments are 32-bit. To enforce 64-bit results, you can use BIGINT(). (But note that if there are non-integer operations, BIGINT() will simply be ignored.) 。有三种计算执行方式:(a) 使用单精度,32IEEE 754浮点数(默认)。 (b) 使用有符号32位整数。(c) 使用64位有符号整数。如果表达式操作结果不是浮点数,那么表达式解析器会自动转到整数方式。否则,它会使用默认的浮点数方式。例如,对于”a+b”,如果两个参数都是32位整数,则会使用32位整数计算;或者 ,如果两个参数都是整数,并且其中一个是64位整数,则会使用64位整数计算方式。否则就使用浮点数方式。然而,”a/b”sqrt(a)总会使用浮点数方式,因为这些操作都返回非整数结果。要避开前者,可以使用IDIV()函数。还有,”a*b”在参数都是32位整数的情况下不会自动转换成64位方式。要强制得到64位的结果,可以使用BIGINT()函数。(注意如果是非整数操作,则BIGINT()函数会被忽略)。


比较操作符(=<=)在件为返回1.0则返回0.0。例如(a=b)+3在属性“a”与属性“b”相等时返回4,否则返回3。与MySQL不同,相等性比较符(即=<>)中引入了一个小的阈值(默认是1e-6)。如果被比较的两个值的差异在阈值之内,则二者被认为相等。


布尔操作符( AND, OR, NOT)0.9.9-rc2引入,行为没什么特别的。它们是左关联操作符,它们的优先级比其他操作符低。NOTANDOR的优先级高,但也不高于其他的操作符。ANDOR优先级相同,因此在复杂表达式中推荐使用括号以避免出现岐义。


的一元函数的意义都很明确,他们的行为在数中的定。但IF()的行为需要细的解3个参数,检查一个参数是0.0,若非零则返回第个参

数,为则返回第三个参数。意,与比较操作符不IF()并不使用!因此

个参数中使用比较结果是安全的,但使用算术算符可能生意之外的结果。如,下

面两会产生不的结果,虽然逻辑上他们是等价的:

IF ( sqrt(3)*sqrt(3)-3<>0, a, b )

IF ( sqrt(3)*sqrt(3)-3, a, b )


种情况下,由于有值,比较操作符<>返回0.0逻辑),IF()返回

b’。在二种情况下,IF()函数亲自在没有阈值的情况下将同样的sqrt(3)*sqrt(3)-3与零值做比较。但由于浮点数运算的精度问题,该表达式的结果与0值会有微小的差异,因此该值与零值的相等比较不会通过,上述第二种情况中IF()会返回‘a’做为结果。


BIGINT() function, introduced in version 0.9.9-rc1, forcibly promotes the integer argument to 64-bit type, and does nothing on floating point argument. It's intended to help enforce evaluation of certain expressions (such as "a*b") in 64-bit mode even though all the arguments are 32-bit. BIGINT()函数自0.9.9-rc2引入,其功能是强制整数参数转换为64位类型,但对浮点数参数没有影响。它的目的是帮助特定的表达式以64位方式求值,即使其参数为32位整数。


DIV()函数执行它2个参数的整数除法。结果也是整数,与”a/b”的结果不同。


IN(expr,val1,val2,...), introduced in version 0.9.9-rc1, takes 2 or more arguments, and returns 1 if 1st argument (expr) is equal to any of the other arguments (val1..valN), or 0 otherwise. Currently, all the checked values (but not the expression itself!) are required to be constant. (Its technically possible to implement arbitrary expressions too, and that might be implemented in the future.) Constants are pre-sorted and then binary search is used, so IN() even against a big arbitrary list of constants will be very quick. Starting with 0.9.9-rc2, first argument can also be a MVA attribute. In that case, IN() will return 1 if any of the MVA values is equal to any of the other arguments. IN(expr,val1,val2,...)函数自0.9.9-rc1引入,带两个或以上个数的参数,如果第一个参数与其他任何一个参数相等,则返回1,否则返回0.目前,所有的被测试的值(但不包括表达式自己)都必须是常量。(从技术上讲也可能实现 用表达式,或许在以后的版本中能实现)。这些常量是预先排序好的,因此可以使用二分查找算法,所以IN()函数即使有大量的参数列表,速度也非常快。自从0.9.9-rc2以来,第一个参数也可以是一个MVA属性。这种情况下,如果MVA值中的任何一个与其他任何一个参数相等,则IN()返回1.


INTERVAL(expr,point1,point2,point3,...), introduced in version 0.9.9-rc1, takes 2 or more arguments, and returns the index of the argument that is less than the first argument: it returns 0 if expr<point1, 1 if point1<=expr<point2, and so on. It is required that point1<point2<...<pointN for this function to work correctly. INTERVAL(expr,point1,point2,point3,...)函数自0.9.9-rc1引入,带两个或以上个数的参数,返回第一个小于第一个参数的位置。如果expr<point1,则返回0,,如果point1<=expr<point2则返回1,依次类推。它需要条件point1<point2<...<pointN才能正常执行。


NOW()函数自0.9.9-rc1引入,它是一个返回当前时间32位整数的工具函数。


GEODIST(lat1,long1,lat2,long2) function, introduced in version 0.9.9-rc2, computes geosphere distance between two given points specified by their coordinates. Note that both latitudes and longitudes must be in radians and the result will be in meters. You can use arbitrary expression as any of the four coordinates. An optimized path will be selected when one pair of the arguments refers directly to a pair attributes and the other one is constant.GEODIST(lat1,long1,lat2,long2)函数,自0.9.9-rc2引入,计算给定的两个坐标点之间的距离。注意纬度和经度都必须在圆弧上,返回结果单位是米。四个坐标点都可以使用任意表达式。当一对直接指向一对属性而另一对是常量的时候会自动选择一个优化的路径。



4.6.结果分组(聚类)

搜索结果分组(说“聚类)并对每组中的结果计数是很有用的例如漂亮的图示每月有blog日志,Web搜索结果按站点分组,把找到的论坛帖子按其作者分组。

理论上,可以分Sphinx全文检索,SQL服务器端对得到的ID分组。但是实中在大结果集(10K10M个匹配)上这样通常会严性能。

避免问题,Sphinx提供种“分组模式,可以用APISetGroupBy()

在分组时,group-by匹配项以一个分组。个值用下内建数之一据特定的

属性值计算:


的搜索结果中包含一个匹配。分组数值和组的匹配数目分“虚拟”属性@group@count返回

结果集按group-by排序排序,语法与SPH_SORT_EXTENDED 排序的语法相@id@weight,分组排序还包括


默认模式是groupby数值序排按照@group desc”排序成时,结果参数total_found会包含个索引上匹配的组的数目。

意:分组操作在定的内存中行,因此给出的是结果;所total_found报告的数目可能给出的个分组数目的和多。@count也可能。要低不准性,应提高max_matches。如果max_matches许存储到的全分组,结果分之的。

例如,如果按相关度排序,时用SPH_GROUPBY_DAY数按属性published”分组,么:


0.9.9-rc2开始,聚类函数(AVG(),MIN(),MAX(),SUM())可通过SetSelect() API调用用于分组查询。


4.7.分布式搜索

为提高可缩性,Sphnix提供分布式检索能。分布式检索可以改查询延迟问题(查询时间)和提高多服务器、多CPU环境下的吞吐率即每秒可以成的查询数)。这对于数据(十亿级录数和TB的文本)上的搜索应用来说

的。

其关键思搜索数据做水分区(HPHorizontally partition),然后并行处理

分区不能自动完成,您需要:


个特索引只包括对其他本地程索引的引用,因此不能它执行重新建立索引的操作,相,如果要对这个特索引行重建,要重建的是那些被这个索引引用到的索引。

searchd到一个分布式索引的查询时,它做如下操作:

1. 接到程代

2. 行查询

3. (在程代行搜索的时)本地索引行查询

4. 程代的搜索结果

5. 将所有结果合并,删除

6. 合并的结果返回给客


在应用程序看来通索引和分布式索引没有。也就是说,分布式索引对于应用程序来说是透明的,没有办法知道你的查询使用的是分布式索引还是本地索引。(即使在0.9.9中,Sphinx不允许通过分布式索引和其他任何索引执行搜索,这一约束在以后也将继续)。That is, distributed indexes are fully transparent to the application, and actually there's no way to tell whether the index you queried was distributed or local. (Even though as of 0.9.9 Sphinx does not allow to combine searching through distributed indexes with anything else, this constraint will be lifted in the future.)


一个searchd实例可以主控端master搜索结果聚合)和从属本地搜索)。这有如下点好处

1. 中的每台机可以主控端来搜索个集,搜索请可以在主控端之间获

载平,相当现了HAhigh availability,高可用性),可以应对某

点失效情况

2. 如果在单CPU器上使用,一个为代理对机进行搜索的searchd实例

可以用到全CPU

HA支持已在计之中,到时将允之间有效性检查、跟踪行中的代检索请求进载均等等


4.8.Searchd日志格式

searchd成功行的搜索查询录在查询日志文件中。以下是一个类录文件的

[Fri Jun 29 21:17:58 2007] 0.004 sec [all/0/rel 35254 (0,20)] [lj] test

[Fri Jun 29 21:20:34 2007] 0.024 sec [all/0/rel 19886 (0,20) @channel_id] [lj]test


日志格式如下

[query-date] query-time [match-mode/filters-count/sort-mode

total-matches (offset,limit) @groupby-attr] [index-name] query


匹配模式(match-mode)可以是如下值之一:


排序模式(sort-mode)可以取如下值之一:


Additionally, if searchd was started with --iostats, there will be a block of data after where the index(es) searched are listed.另外,如果searchd是带参数--iostats启动的,那么在搜索的索引后有一块数据。


A query log entry might take the form of:查询日志持上去可能像下面这格式:

[Fri Jun 29 21:17:58 2007] 0.004 sec [all/0/rel 35254 (0,20)] [lj] [ios=6 kb=111.1 ms=0.5] test


This additional block is information regarding I/O operations in performing the search: the number of file I/O operations carried out, the amount of data in kilobytes read from the index files and time spent on I/O operations (although there is a background processing component, the bulk of this time is the I/O operation time)。这一附加块表示搜索执行时的I/O信息:用到了多少个文件I/O操作,从索引文件中读取了多少K的数据和用在I/O操作上的时间(虽然有一个后端处理组件,这块时间还是I.O操作时间)。



4.9.MySQL 协议支持和SphinxQL

Starting with version 0.9.9-rc2, Sphinx searchd daemon supports MySQL binary network protocol and can be accessed with regular MySQL API. For instance, 'mysql' CLI client program works well. Here's an example of querying Sphinx using MySQL client: 0.9.9-rc2开始,Sphinxsearchd守护进程支持MySQL二进制网络协议,并且可以使用通用的MySQL API访问它。例如,'mysql'命令行客户端程序运行良好。这有一个使用MySQL客户端查询Sphinx的示例:

$ mysql -P 3307

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 0.9.9-dev (r1734)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SELECT * FROM test1 WHERE MATCH('test')

-> ORDER BY group_id ASC OPTION ranker=bm25;

+------+--------+----------+------------+

| id | weight | group_id | date_added |

+------+--------+----------+------------+

| 4 | 1442 | 2 | 1231721236 |

| 2 | 2421 | 123 | 1231721236 |

| 1 | 2421 | 456 | 1231721236 |

+------+--------+----------+------------+

3 rows in set (0.00 sec)



Note that mysqld was not even running on the test machine. Everything was handled by searchd itself. 注意测试机器上没有运行mysqld。所有的工作都是searchd自己处理的。



The new access method is supported in addition to native APIs which all still work perfectly well. In fact, both access methods can be used at the same time. Also, native API is still the default access method. MySQL protocol support needs to be additionally configured. This is a matter of 1-line config change, adding a new listener with mysql41 specified as a protocol: 这种新的运访问方式作为本地API的额外支持的,但它们都运行好非常好。事实上,两种访问方式可以同时使用。另外,本地API是默认的访问方式。MySQL协议支持需要另外的配置。这只涉及到1行配置更改,中需要添加一个新的使用指定的mysql41协议的listener

listen = localhost:9306:mysql41



Just supporting the protocol and not the SQL syntax would be useless so Sphinx now also supports a tiny subset of SQL that we dubbed SphinxQL. Currently implemented statements are: 虽然支持了协议,但不是完整的SQL语法都支持,Sphinx现在只支持SQL的一个小的子集,叫做SphinxQL。现在已经实现的语句有:



SELECT syntax is based upon regular SQL but adds several Sphinx-specific extensions and has a few omissions (such as (currently) missing support for JOINs). Specifically,

Column list clause. Column names, arbitrary expressions, and star ('*') are all allowed (ie. "SELECT @id, group_id*123+456 FROM test1" will work). Unlike in regular SQL, all computed expressions must be aliased with a valid identifier. Special names such as @id and @weight should currently be used with leading at-sign. This at-sign requirement will be lifted in the future. SELECT语法基于通用的SQL,加入了几个Sphinx相关的扩展,还删掉了一些(如现在不支持JOIN)。特别要指出的是,列列表语句,列名,任意表达式和星('*')都是允许的(例如,"SELECT @id, group_id*123+456 FROM test1"能够执行)。与通用SQL不现,所有的计算表达式必须给一个有效的标识符作为别名。特殊的名字,像@id@weight现在应该在前面带上@符号。这个@符号的限制在以后可能去掉。



FROM clause. FROM clause should contain the list of indexes to search through. Unlike in regular SQL, comma means enumeration of full-text indexes as in Query() API call rather than JOIN. FROM语句。FROM语句应该包含要搜索的索引列表。与通用SQL不同的是,逗号的意思是枚举全文索引,正如Query() API调用一样,而不是JOIN



WHERE clause. This clause will map both to fulltext query and filters. Comparison operators (=, !=, <, >, <=, >=), IN(), AND, NOT, and BETWEEN are all supported and map directly to filters. OR is not supported yet but will be in the future. MATCH('query') is supported and maps to fulltext query. Query will be interpreted according to full-text query language rules. There must be at most one MATCH() in the clause. WHERE语句。WHERE语句包含了全文检索和过滤。比较操作符(=,!=,<,>,<=,>=)IN(), AND , NOT BETWEEN都被支持,直接映射到过滤器上。OR 目前还不支持,不过以后可能支持。MATCH('query')被支持,并直接映射到全文检索上。查询部分会被解释为全文检索语言规则。一个语言中最多只有有一个MATCH()



GROUP BY clause. Currently only supports grouping by a single column. The column however can be a computed expression: GROUP BY语句。目前仅支持单一列分组。该列可以是计算表达式:

SELECT *, group_id*1000+article_type AS gkey FROM example GROUP BY gkey

Aggregate functions (AVG(), MIN(), MAX(), SUM()) in column list clause are supported. Arguments to aggregate functions can be either plain attributes or arbitrary expressions. COUNT(*) is implicitly supported as using GROUP BY will add @count column to result set. Explicit support might be added in the future. COUNT(DISTINCT attr) is supported. Currently there can be at most one COUNT(DISTINCT) per query and an argument needs to be an attribute. Both current restrictions on COUNT(DISTINCT) might be lifted in the future. 在语句中的聚合函数(AVG(), MIN(), MAX()SUM())是被支持的。聚合函数的参数可以是文本的属性或者任意的表达式。COUNT(*)是隐式支持的,因为在使用GROUP By的时候会在结果集加@count列。显式支持可能在以后支持。COUNT(DISTINCT attr)也是支持的。目前一个查询中最多只能有一个COUNT(DISTINCT),并且参数必须是一个属性。COUNT(DISTINCT)的这两个限制可能在以后版本中去掉。

SELECT *, AVG(price) AS avgprice, COUNT(DISTINCT storeid)

FROM products

WHERE MATCH('ipod')

GROUP BY vendorid



WITHIN GROUP ORDER BY clause. This is a Sphinx specific extension that lets you control how the best row within a group will to be selected. The syntax matches that of regular ORDER BY clause: WITHIN GROUP ORDER BY 语句。这是一个Sphinx特有的扩展,让你控制选择分组内的最好的行:

SELECT *, INTERVAL(posted,NOW()-7*86400,NOW()-86400) AS timeseg

FROM example WHERE MATCH('my search query')

GROUP BY siteid

WITHIN GROUP ORDER BY @weight DESC

ORDER BY timeseg DESC, @weight DESC



ORDER BY clause. Unlike in regular SQL, only column names (not expressions) are allowed and explicit ASC and DESC are required. The columns however can be computed expressions: ORDER BY语句。与通用的SQL不同,它仅支持列名(非表达式),并且需要显式的指定ASCDESC。然而列可以是计算表达式工:

SELECT *, @weight*10+docboost AS skey FROM example ORDER BY skey



LIMIT clause. Both LIMIT N and LIMIT M,N forms are supported. Unlike in regular SQL (but like in Sphinx API), an implicit LIMIT 0,20 is present by default. LIMIT语句。同时支持LIMIT NLIMIT M,N。与通用SQL不同(但与Sphinx API中相信),默认情况下使用隐式的LIMIT 0,20



OPTION clause. This is a Sphinx specific extension that lets you control a number of per-query options. The syntax is: OPTION语句。这是Sphinx特有的扩展,让你控制每次查询的选项。语法如下:

OPTION <optionname>=<value> [ , ... ]

支持的选项及相应的值有:

示例:

SELECT * FROM test WHERE MATCH('@title hello @body world')

OPTION ranker=bm25, max_matches=3000



SHOW WARNINGS statement can be used to retrieve the warning produced by the latest query. The error message will be returned along with the query itself: SHOW WARNINGS 语句用于获取最近一次查询产生的警告信息。错误信息会和查询结果一起返回:

mysql> SELECT * FROM test1 WHERE MATCH('@@title hello') \G

ERROR 1064 (42000): index test1: syntax error, unexpected TOK_FIELDLIMIT

near '@title hello'



mysql> SELECT * FROM test1 WHERE MATCH('@title -hello') \G

ERROR 1064 (42000): index test1: query is non-computable (single NOT operator)



mysql> SELECT * FROM test1 WHERE MATCH('"test doc"/3') \G

*************************** 1. row ***************************

id: 4

weight: 2500

group_id: 2

date_added: 1231721236

1 row in set, 1 warning (0.00 sec)



mysql> SHOW WARNINGS \G

*************************** 1. row ***************************

Level: warning

Code: 1000

Message: quorum threshold too high (words=2, thresh=3); replacing quorum operator

with AND operator

1 row in set (0.00 sec)





SHOW STATUS shows a number of useful performance counters. IO and CPU counters will only be available if searchd was started with --iostats and --cpustats switches respectively. SHOW STATUS显式一系列有用的性能计数器。仅当searchd --iostats--cpustats开关启动时IOCPU计数器才可用。

mysql> SHOW STATUS;

+--------------------+-------+

| Variable_name | Value |

+--------------------+-------+

| uptime | 216 |

| connections | 3 |

| maxed_out | 0 |

| command_search | 0 |

| command_excerpt | 0 |

| command_update | 0 |

| command_keywords | 0 |

| command_persist | 0 |

| command_status | 0 |

| agent_connect | 0 |

| agent_retry | 0 |

| queries | 10 |

| dist_queries | 0 |

| query_wall | 0.075 |

| query_cpu | OFF |

| dist_wall | 0.000 |

| dist_local | 0.000 |

| dist_wait | 0.000 |

| query_reads | OFF |

| query_readkb | OFF |

| query_readtime | OFF |

| avg_query_wall | 0.007 |

| avg_query_cpu | OFF |

| avg_dist_wall | 0.000 |

| avg_dist_local | 0.000 |

| avg_dist_wait | 0.000 |

| avg_query_reads | OFF |

| avg_query_readkb | OFF |

| avg_query_readtime | OFF |

+--------------------+-------+

29 rows in set (0.00 sec)



SHOW META shows additional meta-information about the latest query such as query time and keyword statistics: SHOW META显示最近一次查询的附加信息,如用时和关键字统计:

mysql> SELECT * FROM test1 WHERE MATCH('test|one|two');

+------+--------+----------+------------+

| id | weight | group_id | date_added |

+------+--------+----------+------------+

| 1 | 3563 | 456 | 1231721236 |

| 2 | 2563 | 123 | 1231721236 |

| 4 | 1480 | 2 | 1231721236 |

+------+--------+----------+------------+

3 rows in set (0.01 sec)



mysql> SHOW META;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| total | 3 |

| total_found | 3 |

| time | 0.005 |

| keyword[0] | test |

| docs[0] | 3 |

| hits[0] | 5 |

| keyword[1] | one |

| docs[1] | 1 |

| hits[1] | 2 |

| keyword[2] | two |

| docs[2] | 1 |

| hits[2] | 2 |

+---------------+-------+

12 rows in set (0.00 sec)



5.命令行工具手册

new for sphinx 0.9.9

5.1.search命令参考

search is one of the helper tools within the Sphinx package. Whereas searchd is responsible for searches in a server-type environment, search is aimed at testing the index from the command line, and testing the index quickly without building a framework to make the connection to the server and process its response.

searchSphinx包中的一个帮助工具。Searchd的功能是 提供服务器端环境的搜索功能,search目标是以命令行的方式测试索引,可以快速的测试索引而不用创建一个的需要连结到服务器并处理返回结果的完整构架。



Note: search is not intended to be deployed as part of a client application; it is strongly recommended you do not write an interface to search instead of searchd, and none of the bundled client APIs support this method. (In any event, search will reload files each time, whereas searchd will cache them in memory for performance.)

注意:search程序并不是为了作为一个客户端应用的一部分;推荐你不要写一个面向search却不用searchd的接口,没有支持这种方法的相应的客户端API绑定。(不论什么条件,search总会在每次搜索的时候重新加载一次索引,但searchd会为了性能把索引缓存在内存中)



That said, many types of query that you could build in the APIs could also be made with search, however for very complex searches it may be easier to construct them using a small script and the corresponding API. Additionally, some newer features may be available in the searchd system that have not yet been brought into search.

或许有人说,可以使用API创建的查询也同样可用search程序实现,但对于 非常复杂的查询,可能使用相应的API创建一个小脚本更容易。另外,有些新功能已经在searchd系统中实现,但还没有移植到search程序中。



search程序调用语法:

search [OPTIONS] word1 [word2 [word3 [...]]]



When calling search, it is not necessary to have searchd running; simply that the account running search has read access to the configuration file and the location and files of the indexes.

在调用search的时候,searchd不必在正在运行;只需要search能访问配置文件和相应位置的索引文件。



The default behaviour is to apply a search for word1 (AND word2 AND word3... as specified) to all fields in all indexes as given in the configuration file. If constructing the equivalent in the API, this would be the equivalent to passing SPH_MATCH_ALL to SetMatchMode, and specifying * as the indexes to query as part of Query.

Search程序的默认行为是在配置文件中包含的所有索引中的所有字段上查询word1 (AND word2 AND word3...)。如果要构建等价的API的话,相当于给SetMatchMode传递SPH_MATCH_ALL,指定*作为Query的索引。



There are many options available to search. Firstly, the general options: search程序有许多可用选项,其中最基本的是:





Options for setting matches: 设置匹配的选项:



处理结果的选项:



Other options:



6.API参考手册

Sphnix编程语言的searchdAPI的实。在本文成之时,我们我们自PHPPythonjava提供方支持。外,也PerlRubyC++

免费、开源API

API的参考实是用PHP写成的,为(我们相之其他语言,SphinxPHP中应用

广泛因此这份参考文档基PHP API的参考,而且节中的所有的代码PHP

给出

,其他所有API提供相的方法,也使用全相协议。因此这份文档他们同样用。在方法习惯面或者具数据结的使用上可能会有小的。但不语言API提供的功能上会有差异


6.1.通用API函数

6.1.1.GetLastError

原型: function GetLastError()

类可读返回错误述信息。如果前一API没有错误返回空字符

何其他数(如 Query()失败后失败一般返回false),该调数,

返回错误

数本并不重置对错误因此有必要,可以多次调用。


6.1.2.GetLastWarning

类可读格式返回述信息。如果前一API没有告,返回空字符

您应该调来确认您的请(如 Query())是否虽然完告。例如,

使程代理超分布式索引的搜索查询也可能成功成。会产生一个

信息

数本重置信息因此有必要,可以多次调用。


6.1.3.SetServer

原型:function SetServer ( $host, $port )

设置searchd主机名和TCP端口此后所有求都使用新的主机端口设置。默认

端口localhost”3312


6.1.4.SetRetries

原型: function SetRetries ( $count, $delay=0 )

设置分布式搜索重试的数和延迟时间。

对于时的失败searchd对每个代重试$count$delay两次重试之间延迟的时间,

为单默认情况下,重试是的。意,用不使API失败进

行重试,searchd这样。目前失败包括connect()用的各种失败程代

接数(过繁忙)的情况


6.1.5.SetConnectTimeout

原型: function SetConnectTimeout ( $timeout )


Sets the time allowed to spend connecting to the server before giving up. 设置放弃之前连接服务器超时时间。


Under some circumstances, the server can be delayed in responding, either due to network delays, or a query backlog. In either instance, this allows the client application programmer some degree of control over how their program interacts with searchd when not available, and can ensure that the client application does not fail due to exceeding the script execution limits (especially in PHP). 在某些情况下,服务器可能由于网络延迟,或者等待一个查询等时可能会延迟响应,这个方法允许客户端程序员在searchd不可用时有一定的控制,以保证客户端程序不会转为脚本超时(尤其在PHP中)而失败。


In the event of a failure to connect, an appropriate error code should be returned back to the application in order for application-level error handling to advise the user.连接失败的时候会返回一个合适的错误代码,应用程序可以处理这个错误并通知用户。


6.1.6.SetArrayResult

原型: function SetArrayResult ( $arrayresult )

PHP用。制搜索结果集的返回格式(匹配项按数组返回是按hash返回

$arrayresult参数应为布尔型。如果$arrayresult默认),匹配项以PHP hash格式返回

文档ID,其他信息(权重、属性)为值。如果$arrayresult,匹配项以通数组

包括匹配项的全信息文档ID

用是MVA属性引入分组支持时时引入的。MVA分组的结果可能包含

文档ID因此需要他们按通数组返回hash对每个文档ID存一个录。


6.1.7.IsConnectError

原型: function IsConnectError ()



Checks whether the last error was a network error on API side, or a remote error reported by searchd. Returns true if the last connection attempt to searchd failed on API side, false otherwise (if the error was remote, or there were no connection attempts at all). Introduced in version 0.9.9-rc1.检查最后一个错误是否是API端的网络错误,还是远程searchd报告的错误。返回true表示连接searchd失败在API端,false表示其他错误(可能错误是远程的,也可能没有任何连接企图)。自0.9.9-rc1引入。



6.2.通用搜索设置

6.2.1.SetLimits

原型: function SetLimits ( $offset, $limit, $max_matches=0, $cutoff=0 )

服务器结果集设置一个$offset)和从起向返回的匹配项数目

限制($limit)。并且可以在服务器设定当前查询的结果集大小($max_matches),

一个值($cutoff),当到的匹配项值时就停止搜索。全这些参数都必

数。

个参数的行为与MySQL LIMIT中参数的行为相。他们searchd从编$offset

的匹配项开返回$limit个匹配项。($offset)和结果数限制($limit)默认值分020返回20个匹配项。

max_match个设置制搜索过程中searchd在内存中持的匹配项数目。一般来说

使设置max_matches1,全的匹配文档也都会被处理分、过滤和排序。但是

刻只有最优N个文档会被存储在内存中,是为性能和内存使用方的原个设

N的大小。意,max_matches个地方设置。单个查询的限制由这

API定。但还有一个对整个服务器的限制,配置文件中的max_matches

制的。为用内存,服务器不许单个查询的限制高服务器的限制。

不可能max_matches个匹配项。默认的限制是1000,您应会遇到需要设置得更高的情况1000足够用户展示了。如果您是想将结果应用程序以便排序过滤,么请意,在Sphinx端完要高得多。

$cutoff设置是为高性能优化而提供的。searchd 到并处理$cutoff个匹配后就强

停止


6.2.2.SetMaxQueryTime

原型: function SetMaxQueryTime ( $max_query_time )

设置大搜索时间,以为单。参数是非数。默认值为0,意是不限制。

个设置与SetLimits()中的$cutoff,不过个设置限制的是查询时间,而不是处理的匹

配数目。一处理时间已,本地搜索查询会被停止意,如果一个搜索查询多个

本地索引,那这个限制独立地作用于这个索引。


6.2.3.SetOverride

原型: function SetOverride ( $attrname, $attrtype, $values )



Sets temporary (per-query) per-document attribute value overrides. Only supports scalar attributes. $values must be a hash that maps document IDs to overridden attribute values. Introduced in version 0.9.9-rc1. 设置临时的(本次查询)文档属性值覆写。仅支持shi量属性。$values必须是一个key值为文档IDvalue值为属性值的哈希表。自0.9.9-rc1引入。



Override feature lets you "temporary" update attribute values for some documents within a single query, leaving all other queries unaffected. This might be useful for personalized data. For example, assume you're implementing a personalized search function that wants to boost the posts that the user's friends recommend. Such data is not just dynamic, but also personal; so you can't simply put it in the index because you don't want everyone's searches affected. Overrides, on the other hand, are local to a single query and invisible to everyone else. So you can, say, setup a "friends_weight" value for every document, defaulting to 0, then temporary override it with 1 for documents 123, 456 and 789 (recommended by exactly the friends of current user), and use that value when ranking.覆写特性允许你“临时地”在本次查询中更新某些文档的属性,但不影响其他的查询。这可能对一些私人化数据有用。例如,假设你实现了一个想查找用户好友推荐的发帖的私人化搜索功能。这些数据不仅是动态的,还是私人的;那么你不能简单地把它放在索引中,因为你不希望每个人的搜索都受影响。或者说覆写是针对本次查询的,其他人看不到的。那么你可以为所有文档创建一个friends_witght值,默认为0,然后临时地对文档123,456,789覆写为1(推荐当前好友的朋友列表),在打分的时候使用这些值。



6.2.4.SetSelect

原型: function SetSelect ( $clause )



Sets the select clause, listing specific attributes to fetch, and expressions to compute and fetch. Clause syntax mimics SQL. Introduced in version 0.9.9-rc1.设置查询语句,列出要获取的特定的属性,要计算并获取的表达式。语句语法与SQL类似。自0.9.9-rc1引入。



SetSelect() is very similar to the part of a typical SQL query between SELECT and FROM. It lets you choose what attributes (columns) to fetch, and also what expressions over the columns to compute and fetch. A certain difference from SQL is that expressions must always be aliased to a correct identifier (consisting of letters and digits) using 'AS' keyword. SQL also lets you do that but does not require to. Sphinx enforces aliases so that the computation results can always be returned under a "normal" name in the result set, used in other clauses, etc. SetSelect()与典型的SQL语句中SELECTFROM之间的部分相似。它让你选择获取什么属性(列),以及要计算并获取的列表达式。与SQL的不同在于,表达式必须用”AS”起个有效的标识符别名(由字母和数据组成)。SQL也允许这么做但并不强求。Sphinx强制用别名以便计算结果能通过“正常的”名字出现的结果集中,则可用于其他语句等。



Everything else is basically identical to SQL. Star ('*') is supported. Functions are supported. Arbitrary amount of expressions is supported. Computed expressions can be used for sorting, filtering, and grouping, just as the regular attributes.



Starting with version 0.9.9-rc2, aggregate functions (AVG(), MIN(), MAX(), SUM()) are supported when using GROUP BY. 其他的都是QL一致。星号(*)支持。函数支持。任意个数表达式支持。计算出的表达式可以像正规的属性一样用于排序、过滤、分组。



Expression sorting (Section 4.5, “SPH_SORT_EXPR mode”) and geodistance functions (Section 6.4.5, “SetGeoAnchor”) are now internally implemented using this computed expressions mechanism, using magic names '@expr' and '@geodist' respectively.

Example:表达式排序(见4.5,“SPH_SORT_EXPR模式”)和距离函数(见 6.4.5,”SetGeoAnchor”)内部实现都是通过表达式计算实现的。例如:

$cl->SetSelect ( "*, @weight+(user_karma+ln(pageviews))*0.1 AS myweight" );

$cl->SetSelect ( "exp_years, salary_gbp*{$gbp_usd_rate} AS salary_usd,

IF(age>40,1,0) AS over40" );

$cl->SetSelect ( "*, AVG(price) AS avgprice" );



6.3.全文搜索设置

6.3.1.SetMatchMode

原型: function SetMatchMode ( $mode )

设置全文查询的匹配模式,参4.1 “匹配模式中的。参数是一个与个已知模

应的常数。

告:(PHP)查询模式常不能包含在引中,那给出的是一个字符而不是一个常

$cl->SetMatchMode ( "SPH_MATCH_ANY" ); // INCORRECT! will not work as expected

$cl->SetMatchMode ( SPH_MATCH_ANY ); // correct, works OK


6.3.2.SetRankingMode

原型: function SetRankingMode ( $ranker )

设置分模式。目前SPH_MATCH_EXTENDED2个匹配模式中提供。参数是与

个已知模式应的常数。

Sphinx默认计算对最匹配权重用的因子要是查询组与文档文本的相度。其

之为BM25的统计数,数值据关字文档中的频率(高频导高权重)和在

个索引中的频率(低频导高权重)在01之间取值。

而,时可能需要换一计算权重的方法——者可能为提高性能而本不计算权值,

结果集用其他法排序。个目的可以通过设置合的相关度计算模式来达到。

的模式包括


6.3.3.SetSortMode

原型: function SetSortMode ( $mode, $sortby="" )

设置匹配项的排序模式,4.5, “ 排序模式中的。参数为与个已知模式

的常数。

告:(PHP)查询模式常不能包含在引中,那给出的是一个字符而不是一个常

$cl->SetSortMode ( "SPH_SORT_ATTR_DESC" ); // INCORRECT! will not work as

expected

$cl->SetSortMode ( SPH_SORT_ATTR_ASC ); // correct, works OK


6.3.4.SetWeights

原型: function SetWeights ( $weights )

按在索引中出现先后顺设置权重。不推荐,请使用SetFieldWeights()


6.3.5.SetFieldWeights

原型: function SetFieldWeights ( $weights )

按字设置字的权值。参数是一个hash(关联数组),hash代表字名字

的字符映射到一个型的权值上。

权重匹配项的评级4.4, “ 权值计算 了词组相度如何评级用用于给的全文数据字段指定不同于默认值的权值。

定的权重32位整数。的权重也是个32数。默认权重为1知的

属性名会被忽略

目前权重没有强制的大限制。但您要,设定过高的权值可能致出现32位整

问题。例如,如果设定权值为10000000并在扩展模式中行搜索,大可能的

权值为10M(您设的值)1000BM25的内部比例系数,参4.4, “ 权值计算

1更多(组相评级)。上结果最少100亿32位整里面没法存储,

不到的结果。


6.3.6.SetIndexWeights

原型: function SetIndexWeights ( $weights )

设置索引的权重,并用不索引中匹配结果权重的加权和。参数为在代表索引名的字

型权值之间建立映射关系的hash(关联数组)。默认值是空数组,意是关

加和。

当在不的本地索引中匹配到相的文档ID时,Sphinx默认查询中定的最后一个

索引。是为支持分重的分区索引。

而在某些情况下索引并不仅仅分区,您可能想将索引中的权值加在一,而不

是简单地选其中的一个。SetIndexWeights()许您。当开启了加和功能最后

匹配权值是个索引中的权值的加权和,索引的权定。也,如果文档

123在索引A被找到,权值是2,在B中也可到,权值是3,而且您

SetIndexWeights ( array ( "A"=>100, "B"=>10 ) ),那么文档123最终返回

给客户端的权值为2*100+3*10 = 230


6.4.结果集过滤设置

6.4.1.SetIDRange

原型: function SetIDRange ( $min, $max )

设置接的文档ID范围。参数数。默认00,意是不限制范围

此调只有ID$min$max包括$min$max)之间的文档会被匹配。


6.4.2.SetFilter

原型: function SetFilter ( $attribute, $values, $exclude=false )

增加数值过滤器。

此调用在已的过滤器表中加新的过滤器。$attribute是属性名。$values数数组。

$exclude是布尔值,制是接匹配的文档(默认模式,$exclude时)

们。

只有当索引中$attribute的值与$values中的一值匹配时文档会被匹配(,如

$exclude值为

6.4.3.SetFilterRange

原型 : function SetFilterRange ( $attribute, $min, $max, $exclude=false )

加新的范围过滤器。

此调用在已的过滤器表中加新的过滤器。$attribute是属性名, $min$max义了

一个区间,$exclude布尔值,制是接匹配的文档(默认模式,$exclude

时)们。

只有索引中$attribute的值$min$max之间(包括$min$max),文档会被匹配

,如果$exclude值为)。


6.4.4.SetFilterFloatRange

原型: function SetFilterFloatRange ( $attribute, $min, $max, $exclude=false )

增加新的范围过滤器。

此调用在已的过滤器表中加新的过滤器。$attribute是属性名, $min$max义了

一个区间,$exclude是布尔值,制是接匹配的文档(默认模式,

$exclude时)们。

只有当索引中$attribute的值$min$max之间(包括$min$max),文档会被

配(,如果$exclude值为)。


6.4.5.SetGeoAnchor

原型: function SetGeoAnchor ( $attrlat, $attrlong, $lat, $long )

为地表距离计算设置,并且许使用们。

$attrlat$attrlong是字符,分别指了对度和度的属性名$lat$long值,度和度值,以度为单

设置,您可以在您的过滤器和/排序表式中使用@geodist属性。Sphinx全文检索中计算度与之前的地表距离,并把此距离加到匹配结果上SetGeoAnchor和索引属性数据中的度值度。而结果为单返回地表距离1000.0代表1。一1609.344


6.5.GROUP BY 设置

6.5.1.SetGroupBy

原型: function SetGroupBy ( $attribute, $func, $groupsort="@group desc" )

设置行分组的属性、数和组间排序模式,并用分组(参考 4.6, “ 结果分组(聚类)中的)。

$attribute是字符,为行分组的属性名。$func为常数,定内建数,数以前

所述的分组属性的值为输入,目前的可选的值为:

SPH_GROUPBY_DAYSPH_GROUPBY_WEEKSPH_GROUPBY_MONTH

SPH_GROUPBY_YEARSPH_GROUPBY_ATTR

$groupsort制分组如何排序的。其语法与 4.5, “SPH_SORT_EXTENDED 模式

的相

分组与SQL中的GROUP BY上相生的结果与下代码生的

结果相

SELECT ... GROUP BY $func($attribute) ORDER BY $groupsort

意,响最结果集中匹配项序的是$groupsort。排序模式(5.3.3,“SetSortMod e”响每个分组内的序,即每组内匹配项被视匹配。如,组之间可以

组中的匹配项数排序的组组内据相关度排序。

Starting with version 0.9.9-rc2, aggregate functions (AVG(), MIN(), MAX(), SUM()) are supported through SetSelect() API call when using GROUP BY. 自从0.9.9-rc2开始,聚类函数(AVG(), MIN(), MAX(), SUM())也可通过SetSelect() 调用用于分组(GROUP BY)了。


6.5.2.SetGroupDistinct

原型: function SetGroupDistinct ( $attribute )

设置分组中需要计算不取值数目的属性名。在分组查询中有效

$attribute包含属性名的字符个组的个属性的取值都会被储存要内存

许),其后此属性在组中不值的会被计算出来返回给客个特性与标准

SQL中的COUNTDISTINCT因此如下Sphinx

$cl->SetGroupBy ( "category", SPH_GROUPBY_ATTR, "@count desc" );

$cl->SetGroupDistinct ( "vendor" );

等价于如下的SQL

SELECT id, weight, all-attributes,

COUNT(DISTINCT vendor) AS @distinct,

COUNT(*) AS @count

FROM products

GROUP BY category

ORDER BY @count DESC

在上述示代码中,SetGroupDistinct()COUNTDISTINCT vendor应。

GROUP BYORDER ByCOUNT(*)句则SetGroupBY()等价个查询都会

类中返回一个匹配的行。索引中的属性,匹配项可以包含每类的匹配项计数和类中

vendor Id的计数。


6.6.Querying

6.6.1.Query

原型: function Query ( $query, $index="*" )

接到searchd服务器,据服务器的当前设置定的查询,取得并返回结果集。

$query是查询字$index包含一个多个索引名的字符。一发生一般错误则返回

并设置GetLastError()信息。若成功则返回搜索的结果集。 Additionally, the contents of $comment are sent to the query log, marked in square brackets, just before the search terms, which can be very useful for debugging. Currently, the comment is limited to 128 characters.

$index默认值是*”,意本地索引查询。索引名中许的字符包括拉丁

a-z),数字(0-9),减号-)和下线_),其他字符均视为分符。因此,下

有效的,而且搜索相个索引。

$cl->Query ( "test query", "main delta" );

$cl->Query ( "test query", "main;delta" );

$cl->Query ( "test query", "main, delta" );

给出多个索引时的序是的。如果一个文档ID的文档在多个索引中到,么权

值和属性值最后一个索引中存储的作为文档ID的权值和属性值,用排序、过滤,

返回给客非用SetIndexWeights()式改默认行为)。因此在上述示例中,索引

delta”中的匹配项索引main”中的更优先

如果搜索成功,Query()返回的结果集包含找到的全匹配项中的一分(SetLimits()

设定)和与查询相关的统计数据。结果集是hashPHP,其他语言的API可能使用其他数

据结),包含如下和值:

"matches":

是一个hash表,存储文档ID应的一个包含文档权重和属性值的hash表(者是数组,如果SetArrayResult())。

"total":

查询在服务器检索得的匹配文档数(服务器结果集的大小)。是在当前设置下,用当前查询可以从服务器获得的匹配文档数目的上限。

"total_found":

(服务器上到和处理了的)索引中匹配文档的数。

"words":

一个hash查询关字(关字已过大小写转换,取干和其他处理映射到一个包含字的统计数据(docs”——在多文档中出现hits”——共出现了少次)的小hash表上。

"error":

searchd报告的错误信息类可读的字符)。若错误为空字符

"warning":

searchd报告的信息类可读字符)。若无警为空

It should be noted that Query() carries out the same actions as AddQuery() and RunQueries() without the intermediate steps; it is analoguous to a single AddQuery() call, followed by a corresponding RunQueries(), then returning the first array element of matches (from the first, and only, query.)



6.6.2.AddQuery

Prototype: function AddQuery ( $query, $index="*", $comment="" )


查询增加一个查询。$query为查询$index包含一个多个索引名的字符$comment are sent to the query log, marked in square brackets, just before the search terms, which can be very useful for debugging. Currently, this is limited to 128 characters. 返回RunQueries()返回的数组中的一个下标。Additionally if provided, the contents of


查询(多查询)使searchd够进行可能的内优化,并且情况都会

少网接和建方的开。相对于单独的查询,查询不引入何额外的开

因此当您的Web个不的查询时,一定要考使用查询。


例如,多次运一个全文查询,但使用不的排序分组设置,这会使searchd仅运行一

销昂的全文检索和相关度计算,然后基础上生多个分组结果。


时您不需要简单地显示搜索结果,而且要显示与类相关的计数信息,例如按制

商分组产品数目,查询的开。若查询,您会必将这些

的查询行多并取的匹配项,最后产生不的结果集。若使用

询,您将这些查询简单地组成一个查询,Sphinx在内优化这些的全文搜

索。


AddQuery()在内存储全当前设置查询,您也可在后续SubQuery()用中改

设置。加入的查询不会被,实没有任法可以改变它们。下是一个例:

$cl->SetSortMode ( SPH_SORT_RELEVANCE );

$cl->AddQuery ( "hello world", "documents" );


$cl->SetSortMode ( SPH_SORT_ATTR_DESC, "price" );

$cl->AddQuery ( "ipod", "products" );


$cl->AddQuery ( "harry potter", "books" );


$results = $cl->RunQueries ();


用上代码,一个查询documents”索引上查询hello world”结果按相关度排序,

个查询products”索引上查询ipod”结果按格排序,第三个查询在books”

索引上搜索harry potter”,结果格排序。意,SetSortMode()用并不

一个查询(经被),但后面个查询都会受


Additionally, any filters set up before an AddQuery() will fall through to subsequent queries. So, if SetFilter() is called before the first query, the same filter will be in place for the second (and subsequent) queries batched through AddQuery() unless you call ResetFilters() first. Alternatively, you can add additional filters as well.


This would also be true for grouping options and sorting options; no current sorting, filtering, and grouping settings are affected by this call; so subsequent queries will reuse current query settings.


AddQuery()返回RunQueries()返回的数组中的一个下标。是一个从0数,

次调返回0二次返回1,以个方便的特性使在需要这些下标的时

不用手工们。


6.6.3.RunQueries

原型: function RunQueries ()

接到searchdAddQuery()加的全查询,获取并返回它们的结果集。若发生一

错误(例如I/O失败则返回并设置GetLastError()信息。若成功则返回结果集的简

单数组。

数组中的一个结果集Query()返回的结果集全相意,查询请

是成功——有网错误行索引换,者其他致整个查询被处理

而其中的单个的查询可能失败时与之应的结果集只包含一个非空的“错误”信息

没有匹配查询的统计信息。在端情况下,查询中的所有单个查询可能都失败

这仍然报告一般错误API成功地接到searchd,提查询并

得到返回结果——个结果集都只包含特定的错误信息


6.6.4.ResetFilters

原型: function ResetFilters ()

清除当前设置的过滤器。

通常此调用在使用查询的时候会用到。您可能需要为查询中的不查询提供不

过滤器,为个目的,您需要ResetFilters()然后用其他用增加新的过滤器。


6.6.5.ResetGroupBy

原型: function ResetGroupBy ()

清除现有的全分组设置,并关分组。

通常此调用在使用查询的时候会用到。单独的分组设置可以用SetGroupBy()

SetGroupDistinct(),但们不能关分组。ResetGroupBy()之前的分组设置彻底

置并在当前下关分组模式,因此后续AddQuery()可以分组的搜索。


6.7.额外的功能

6.7.1.BuildExcerpts

原型: function BuildExcerpts ( $docs, $index, $words, $opts=array() )

数用来产生文档要)。接到searchd,要定文档中

要),并返回结果。

$docs包含各文档内容的数组。$index包含索引名字的字符定索引的不设置

(例如字符集、形态的设置)会被使用。$words包含需要高的关字的字符按索引的设置被处理。例如,如果语取干(stemming)在索引中设置为许,使关shoe”shoes”会被Starting with version 0.9.9-rc1, keywords can contain wildcards, that work similarly to star-syntax available in queries. $opts包含其他可选的高参数的hash

"before_match":

在匹配的关字前入的字符默认<b>”

"chunk_separator":

)之间入的字符默认...”

"limit":

包含的符(码)数。数,默认256.

"around":

个关块左右选取的的数目。数,默认5.

"exact_phrase":

否仅亮精匹配的个查询组,而不是单独的关。布尔值,默认

"single_passage":

否仅的一个。布尔值,默认

失败返回。成功时返回包含有要)字符的数组。


6.7.2.UpdateAttributes

原型: function UpdateAttributes ( $index, $attrs, $values )

更新定文档的定属性值。成功则返回更新的文档数目(0更多),失败

返回-1

$index更新的(一个多个)索引名。$attrs为属性名字符的数组,其所列的属性

更新。$valueshash表,$values表的为文档ID$values表的值为新的属性值的简单

数组。

$index可以是一个单独的索引名,也可以是一个索引名的表,Query()的参数。与

Query()的是不许通配符,全部待更新的索引明确指出。索引名表可以包含

布式索引。分布式索引,更新会同到全上。

只有docinfo=extern个存储可以行更新。更新非常快,为操作全在内存

行,但们也可以成持的,更新searchd时(SIGTERM时)

写入磁盘With additional restrictions, updates are also possible on MVA attributes; refer to mva_updates_pool directive for details.


使用例:

$cl->UpdateAttributes ( "test1", array("group_id"), array(1=>array(456)) );

$cl->UpdateAttributes ( "products", array ( "price", "amount_in_stock" ),

array ( 1001=>array(123,5), 1002=>array(37,11), 1003=>(25,129) ) );

第一条示例语句会更新索引“test1”中的文档1,设置“group_id”456.第二条示例

语句则更新索引“products”中的文档100110021003。文档1001的“price”

被更新为123,“amount_in_stock”会被更新为5;文档1002,“price”变为37

amount_in_storage”变为11,等等。


6.7.3.BuildKeywords

原型: function BuildKeywords ( $query, $index, $hits )


Extracts keywords from query using tokenizer settings for given index, optionally with per-keyword occurrence statistics. Returns an array of hashes with per-keyword information.


$query is a query to extract keywords from. $index is a name of the index to get tokenizing settings and keyword occurrence statistics from. $hits is a boolean flag that indicates whether keyword occurrence statistics are required.


Usage example:

$keywords = $cl->BuildKeywords ( "this.is.my query", "test1", false );


6.7.4.EscapingString

原型: function EscapeString ( $string )


转义被sphinx查询语言解析器认为是特殊字符的字符。返回转义过的字符串。


$string 是需要转义的字符串。


这个函数看上去可能是多余的,因为它可以在调用程序中实现。然而,由于特殊字符可能改变,这确保在所有情况下都有一个转义所有特殊字符的API调用。


例子:

$escaped = $cl->EscapeString ( "escaping-sample@query/string" );


6.7.5.Status

原型: function Status ()



查询searchd运行状态,返回状态及值的数组。



例子:

$status = $cl->Status ();

foreach ( $status as $row )

print join ( ": ", $row ) . "\n";



6.8.持久连接(长连接)

持久连接允许在单一网络连结上执行多个命令,如果不这么用,需要重连多次。

6.8.1.Open

原型: function Open ()



打开到服务器的持久连接。

6.8.2.Close

原型: function Close ()



关闭先前打开的持久连接。



7.MySQL存储引擎(SphinxSE)


8.报告 bugs



9.sphinx.conf选项参考

9.1.Data Source配置选项

9.1.1.type

数据源类型。选项,默认值。已知的类型包括mysqlpgsqlxmlpipe, xmlpipe2odbc所有其他与数据源相关的选项依赖于这个选项定的源类型。与SQL数据源(MySQLPostgreSQL)相关的选项以sql_”,而与xmlpipexmlpipe2数据源相关的选项xmlpipe_”All source types except xmlpipe are conditional; they might or might not be supported depending on your build settings, installed client libraries, etc. mssql type is currently only available on Windows. odbc type is available both on Windows natively and on Linux through UnixODBC library.除了xmlpipe之外,所有的数据源类型都是有条件的;是否支持依赖于编译时的设置,已安装的客户端库等 。mssql类型仅能用于Windowsodbc类型在Windows上是有原生支持的,在Linux平台上需要UnixODBC库的支持。

例:

type = mysql

9.2.索引文件配置选项

9.2.1.path

索引文件的和文件名(不包括扩展名)。选项。

path包括文件包括文件名,但不包括扩展名。indexer时索引文件的名字时会附加上不的扩展名。数据文件个不的扩展名,.sp”时文件的扩展名以.tmp”。如果indexer没有成功地自删除.tmp*文件,手工删除是安全的。

以下是不索引文件存储的数据类,供参考:


例:

path = /var/data/test1

9.3.indexer索引器程序配置选项

9.3.1.mem_limit

索引过程内存使用限制。可选选项,默认32M

indexer会超制内存限制。可以以字节、字节(以K字节(以M)为单。参见示例。当过小的值I/O缓冲8KB限制提高,值的低限度依赖索引数据的大小。如果缓冲256KB会产告。大可能的限制是2047M低的值索引速度,但256M1024M对绝大多数数据集(如果不是全来说该足够了个值设得高可能SQL服务器时。在文档阶段时内存缓冲的一会被排序,而与数据库的通信会是数据库服务器可能时。可以通过提高SQL服务器时时间mem_limit解决。

例:

mem_limit = 256M

# mem_limit = 262144K # same, but in KB

# mem_limit = 268435456 # same, but in bytes


9.3.2.max_iops

每秒最I/O操作数,用限制I/O操作。可选选项,默认0限制)。

I/O流有关的选项。限制了每秒大的I/O操作(读写)的数。值0是不

加限制。

indexer在索引时可能致突发的磁盘I/O因此需要限制磁盘活动给同台机器上行的其他程序源,searchd)。I/O流就是用功能的。的工作原是,在indexer连续磁盘I/O操作之间制增加一个延迟SATA盘每秒可以行多70-100以上I/O操作(受磁头寻时间的限制)。索引I/O限制为上数值的分之一可以减轻索引带来的搜索性能下

例:

max_iops = 40


9.3.3.max_iosize

许的I/O操作大小,以字节为单,用I/O。可选选项,默认0(不限制)。与I/O流有关的选项。限制indexer文件I/O操作的单次最大大小。值0代表不加限制。过限制的读写操作会被分成个小的操作,并max_iops 计为多。在本文写作时,全I/O操作都被限制在256KB以下(默认的内部缓冲大小),因此256KBmax_iosize没有任何作用。

例:

max_iosize = 1048576


9.3.4.max_xmlpipe2_field

允许XMLPipe2数据源中最大字段大小,以字节计,可选选项,默认是2MB

例如:

max_xmlpipe2_field = 8M



9.3.5.write_buffer

写缓冲区大小,可选选项,默认是1MB



Write buffers are used to write both temporary and final index files when indexing. Larger buffers reduce the number of required disk writes. Memory for the buffers is allocated in addition to mem_limit. Note that several (currently up to 4) buffers for different files will be allocated, proportionally increasing the RAM usage.

例如:

write_buffer = 4M

9.4.Searchd程序配置选项







Dsfdsfdsfdsf

dsfdsf

10.Sphinx版本历史

11.错误代号列表

11.1.Indexer

11.2.searchd

12.常见问题说明

70/70