目录

9.2.索引配置选项

优质
小牛编辑
130浏览
2023-12-01

9.2.1.type

索引类型。可选选项,默认值为空(索引为简单本地索引)。可用的值包括空字符串或“distributed”

Sphinx支持两种不同的索引类型:本地——在本机上存储和处理,和远程——不仅涉及本地搜索,而且同时通过网络向远程searchd实例做查询。索引类似选项使您可以选择使用何种索引。索引默认是本地型。指定“distributed”索引类型会运行分布式搜索,参看Section4.7, “分布式搜索”.

示例:

type = distributed

9.2.2.source

向本地索引增加文档源。可以出现多次,必须选项。

为当前索引指定一个从中可以获取文档的文档源。必须至少有一个文档源。可以有多个文档源,任何数据源类型都可接受:即您可以从MySQL服务器中获取一部分数据,从PostgreSQL中获取另一部分,再在文件系统上使用xmlpipe2获取一部分。

然而,对源数据却有一些限制。首先,文档ID必须在所有源的总体上是唯一的。如果这个条件不满足,那可能导致非预期的搜索结果。其次,源的模式必须相同,以便在同一个索引中存储。

数据来源的ID不会被自动存储。因此,为了获知匹配的文档是从哪个数据源中来的,需要手工存储一些额外的信息。通常有两种方法:

  1. 修改文档ID,将源ID编码进去:
    source src1
    {
    sql_query = SELECT id*10+1, ... FROM table1
    ...
    }
    source src2
    {
    sql_query = SELECT id*10+2, ... FROM table2
    ...
    }
  2. 将数据来源存储为一个属性:
    source src1
    {
    sql_query = SELECT id, 1 AS source_id FROM table1
    sql_attr_uint = source_id
    ...
    }
    source src2
    {
    sql_query = SELECT id, 2 AS source_id FROM table2
    sql_attr_uint = source_id
    ...
    }

示例:

source = srcpart1
source = srcpart2
source = srcpart3

9.2.3.path

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

path既包括文件夹也包括文件名,但不包括扩展名。indexer在产生永久和临时索引文件的最终名字时会附加上不同的扩展名。永久数据文件有几个不同的扩展名,都以“.sp”开头,临时文件的扩展名以“.tmp”开头。如果indexer没有成功地自动删除.tmp*文件,手工删除是安全的。

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

  • .spa存储文档属性(仅在extern docinfo存储模式中使用);
  • .spd存储每个词ID可匹配的文档ID列表;
  • .sph存储索引头信息;
  • .spi存储词列表(词ID和指向.spd文件的指针);
  • .spm存储MVA数据;
  • .spp存储每个词ID的命中(或者说记账,或者词的出现)列表;

示例:

path = /var/data/test1

9.2.4.docinfo

文档信息(docinfo)的存储模式。可选选项,默认是“extern”已知的值包括'none', 'extern' 和 'inline'.。

此选项确切定义了文档信息在磁盘和RAM中的物理存储方式。“none”意思是根本不存储文档信息(没有任何属性)。通常并不需要显式设置为 “none”因为当没有配置任何属性时Sphinx会自动选择“none”。“inline”代表文档信息与文档ID列表一同存储在在.spd文件中。“extern”代表文档信息与文档ID分开(在外部)存储(在.spa文件中)。

基本上,外部存储的文档信息在查询时必须保持在内存中。这是性能的原因。因此有时候“inline”是唯一的选择。然而这种情况并不多见,文档信息默认是“extern”存储的。深入的探讨和RAM使用的估计请参见Section3.2, “属性”。

示例:

docinfo = inline

9.2.5.mlock

已缓冲数据的内存锁定。可选选项,默认为0(不调用mlock())

为提高性能,searchd.spa.spi文件预取到内存中,并一直在内存中保存它们的拷贝。但如果一段时间内没有对该索引的搜索,则对这份缓冲的拷贝没有内存访问,而操作系统可能会决定将它交换到磁盘上去。对这些“冷却”了的索引的访问会导致其交换回内存并得到一个较大的延迟。

将mlock选项设置为1会使Sphinx使用mlock(2)系统调用将存储上述缓冲了的数据的系统内存锁定,这将避免内存交换(详情参见man 2 mlock)。mlock(2)是特权调用,因此可能需要searchd以root账户运行或通过其他办法赋予足够的权限。如果mlock()失败会发出警告,但索引会继续进行。

示例:

mlock = 1

9.2.6.morphology

词形处理器的列表。可选选项,默认为空(不使用任何词形处理器)。

词形处理器可以将待索引的词从各种形态变成基本的规则的形态。例如,英语词干提取器(English stemmer)可以将“dogs”和“dog”都变成“dog”,这使搜索这两个词的结果都相同。

内置的词形处理器包括英语词干提取器,俄语词干提取器(支持UTF-8和Windows-1251编码),Soundex和Metaphone。后面两个会将词替换成特殊的语音编码,这会使发音相近的词表示形式相同。Snowball项目的libstemmer库提供的额外词干提取器可以通过在编译期对configure脚本使用--with-libstemmer选项来启用。内建的英语和俄语词干提取器要比它们在libstemmer中的对应物模块运行更快,但它们的结果可能略有不同,因为内建的版本基于较旧的版本。Metaphone基于Double Metaphone算法实现。

morphology选项中可使用的内建值包括 “none”,“stem_en”,“stem_ru”,“stem_enru”, “soundex”和“metaphone”。libstemmer提供的额外值格式为“libstemmer_XXX”,XXX指libstemmer 算法的代号。(完整列表参见libstemmer_c/libstemmer/modules.txt

可以指定多个词干提取器(以逗号分隔)。这些提取器按列出的顺序应用于输入词串,整个处理会在第一个真正修改了原词的词干提取器之后停止。另外,当wordforms特性启用时,词会现在词形字典中查询,如果词典中有对应的条目,那么词干提取器干脆不会被使用。换个说法,wordforms选项可以用来补充指定词干提取器的例外情况。

示例:

morphology = stem_en, libstemmer_sv

9.2.7.min_stemming_len

启用词干化的最小词长。可选选项,默认为1(对任何词都进行词干化)。于版本0.9.9-rc1引入。

词干化方法并不完美,有时会产生用户不想要的结果。例如,如果用英语的Porter stemmer词干化算法处理关键词“gps”,得到的结果是“gp”,显然这是不对的。min_stemming_len这个特性允许根据词的长度来决定是否跳过词干化,即不对较短的词进行词干化。注意,词长等于这个选项设置的值的词被词干化。因此要避免对3个字符长的关键词进行词干化,必须指定这个选项的值为4。要活的更细粒度的控制,请参考wordforms这个特性。

示例:

min_stemming_len = 4

9.2.8.stopwords

停用词文件列表(空格分隔)。可选选项,默认为空。

停用词是不被索引的词。停用词表一般包括最常用的高频词,因为它们对搜索结果没有多大帮助却消耗很多处理资源。

可以指定多个文件名,用空格分隔。所有文件都会被载入。停用词文件的格式是简单的纯文本。其编码必须与charset_type选项所指定的索引编码相匹配。文件数据会根据charset_type选项的设置进行切分,因此您可以使用与待索引数据相同的分隔符。词干提取器(stemmers)也会在停用词文件的分析中使用。

尽管停用词不会被索引,它们却影响关键词的位置。例如,假设“the”是一个停用词,文档1包含一行“in office”,而文档2包含“in the office”。将“in office”作为确切词组搜索则只会得到文档1,虽然文档2里的the是停用的。

示例:

stopwords = /usr/local/sphinx/data/stopwords.txt
stopwords = stopwords-ru.txt stopwords-en.txt

9.2.9.wordforms

词形字典。 可选选项,默认为空。

词形字典在输入文档根据charset_table切 碎后使用。本质上,它使您可以将一个词替换成另一个。这通常被用来将不同的词形变成一个单一的标准形式(即将词的各种形态如 “walks”,“walked”,“walking”变为标准形式“walk”)。也可以用来实现取词根的例外情况,因为词形字典中可以找到的词不会经 过词干提取器的处理。

索引和搜索中的输入词都会利用词典做规则化。因此要使词形字典的更改起作用,需要重新索引并重启searchd

Sphnix的词形支持被设计成可以很好地支持很大的字典。它们轻微地影响索引速度:例如,1M个条目的字典会使索引速度下降1.5倍。搜索速度则 完全不受影响。额外的内存占用大体上等于字典文件的大小,而且字典是被多个索引共享的,即如果一个50MB的词形字典文件被10个不同的索引使用了,那么 额外的searchd内存占用就是大约50MB。

字典文件的格式是简单的纯文本。每行包括一个源词形和一个目标词形,编码应与charset_type选项所指定的完全相同,二者用大于号分隔。文件载入时会经过charset_table选项指定的规则的处理。因此基本上在大小写是否敏感这个问题上它是与待索引的全文数据相同的,即通常是大小写无关的。一下是个文件内容的例子:

walks > walk
walked > walk
walking > walk

我们提供了一个spelldump工具,它可以帮您从ispellMySpell(OpenOffice提供)格式的.dict.aff字典文件生成Sphinix可接受的格式。

从版本0.9.9-rc1开始,可以将好几个源词对应到同一个目标词上。由于这个过程作用于符号化之后的结果而不是原始文本,空白字符和标记语言都被忽略。

core 2 duo > c2d
e6600 > c2d
core 2duo > c2d

示例:

wordforms = /usr/local/sphinx/data/wordforms.txt

9.2.10.exceptions

Token特例文件。 可选选项,默认为空。

对于使用Coreseek的中文用户,这一选项无效。Coreseek为Sphinx贡献的中文分词法内置了Token特例化支持,具体参阅Coreseek MMSeg分词法的文档。不过,值得高兴的是,Token特例化的文件格式两者是同样的。

此选项允许将一个或多个Token(Token中,可以包括在正常情况下会被过滤的字符)映射成一个单独的关键词。exceptions选项与wordforms选项很类似,它们都代表某种映射,但有一些重要的不同点。

这些不同点简要总结如下:

  • exceptions 大小写敏感, wordforms大小写无关;
  • exceptions 允许检测一串记号, wordforms仅对单独的词有效;
  • exceptions 可以使用charset_table中没有的特殊符号,wordforms完全遵从charset_table;
  • exceptions 在大字典上性能会下降wordforms则对百万级的条目应对自如。

输入文件的格式仍然是纯文本,每行一个分词例外,而行的格式如下:

map-from-tokens => map-to-token

示例文件

AT & T => AT&T
AT&T => AT&T
Standarten   Fuehrer => standartenfuhrer
Standarten Fuhrer => standartenfuhrer
MS Windows => ms windows
Microsoft Windows => ms windows
C++ => cplusplus
c++ => cplusplus
C plus plus => cplusplus

这里全部的记号都是大小写敏感的:它们不会按charset_table选项的规则处理。因此,在上述例外文件下,“At&t”会被分成两个关键字“at”和“t”,因为其中的小写字母。而“AT&T”却被精确匹配并产生一个单独的关键字“AT&T”。

需要注意的是,前述映射文件的目标关键词(右侧)a)总是被解释成一个单独的词,而且b)不仅是大小写敏感的,而且是空白符号敏感的!在上述样例中,查询“ms windows”不会匹配包含“MS Windows”的文档。这个查询会被解释成两个词“ms”和“Windows”。而“MS Windows”映射到的是一个单独的 关键字“ms windows”,包括中间的空格。另一方面“standartenfuhrer”会取回带有“Standarten Fuhrer”或者“Standarten Fuehrer”内容的文档(大写字母必须与此处列出的完全相同),或者关键词本身大小写随意的任何版本,例如“staNdarTenfUhreR”。 (然而“standarten fuhrer”不会匹配。这段文本无法与列出的任何一个例外相匹配,因为大小写不同。因此被索引为两个分开的关键字)

映射源部分的空白符(white space)不会被忽略,但空白符的数量无所谓。任何数量的空白符都匹配已索引的文档或者查询中的任意数量的空白符。例如映射源部分(“=>”左 端)的“AT�&�T”可以匹配“AT��&�T”,不管被映射部分或已索引全文数据中实际有几个空格。根据上述例子中的第一条,上述文 本会作为“AT&T”关键字被索引。对于使用Coreseek的中文用户,这个特性目前尚不被支持。Coreseek将在后续版本支持这个特性。

exceptions选项也允许特殊字符(这是通用charset_table选项规则的例外(exception),此选项因而得名)。假设您一般不想把“+”当作有效的字符,但仍想搜索一些例外情况,比如“C++”。上述例子正好可以做到这点,完全不管哪些字符在表中,哪些字符不在。

Exceptions选项被应用于原始输入文档和索引、搜索时的查询数据。因此要使文件的改动生效,需要重建索引并重启searchd

示例:

exceptions = /usr/local/sphinx/data/exceptions.txt

9.2.11.min_word_len

最小索引词长度。可选选项,默认为1(索引任何词)

只有长度不小于这个最小索引词长度的词会被索引。例如,如果min_word_len为4,那么“the”这个词不会被索引,但“they”会。

示例:

min_word_len = 4

9.2.12.charset_type

字符集编码类型。可选选项,默认为“sbcs”。已知的值包括“sbcs”和“utf-8”。对于使用Coreseek的中文用户,可选的值还可以有“zh_cn.utf-8 ”、“zh_cn.gbk”和“zh_cn.big5”。当设置charset_type值为上面的值时,系统默认您开启了中文分词特性。

不同的编码将它们的内部字符代码映射到特殊字节序列的方法不同。目前两个最常见的方法是单字节编码和UTF-8。它们对应的 charset_type值分别是“sbcs”(代表Single Byte Character Set单字节字符集)和“utf-8”。选定的编码类型会在搜索被使用的任何情况下使用:索引数据时,对索引查询时,产生摘要时,等等。

注意,尽管“utf-8”暗示解码出来的值应按unicode码点数值对待,“sbcs”却对应一系列不同的编码,它们对不同字节值的处理不同,这要在charset_table设置中正确地反应出来。例如,同一个值244(十六进制0xE0)根据使用的是koi-8r还是windows-1251编码而映射到不同的俄语字符。

示例:

charset_type = utf-8

9.2.13.charset_table

接受的字符表和大小写转换规则。可选选项,默认值与charset_type选项的值有关。对于使用Coreseek的中文用户,Coreseek 提供的MMseg分词法内置了可接受的字符表,并且用户不可修改。当启用分词功能时,自动开启。

charset_table频繁应用于Sphinx的分词过程,即从文档文本或查询文本中抽取关键字的过程。它控制哪些字符被当作有效字符接受,哪些相反,还有接受了的字符如何转换(例如大小写信息保留还是去除)。

可以把charset_table想成一个对超过100K个Unicode字符中每一个的映射关系的大表(或者一个256个字符的小表,如果你使用 SBCS)。默认每个字符都对应0,这表示它不在关键字中出现,应被视为分隔符。一旦在此表中被提及,字符就映射到另一个字符(通常是它自身或者自身的小 写版本),同时被当作一个可以出现在关键字中的有效字符。

值的格式是逗号分隔的映射列表。两种最简单的映射分别是声明一个字符为有效和将一个简单字符映射为另一个字符。但用这种格式指定整个表会导致其体积臃肿、无法管理。因此提供了一些语法上的快捷方式,用它们可以一次指定一定范围的字符。详细的列表如下:

A->a
单个字符映射,声明源字符“A”为允许出现在关键字中的字符,并将之映射到目的字符“a”(这并没有声明“a”是允许的)。
A..Z->a..z
范围映射,声明源范围中的全部字符允许出现在关键字中,并将它们映射到目的范围。并不声明目的范围是允许的。此外会检查 (长度必须相等) 的范围的长度。
a
单一字符映射,声明一个允许的字符,将它映射到它自身。相当于单个字符映射 a->a 。
a..z
杂散范围映射,声明范围中的全部字符为允许,将它们映射到自身。相当于范围映射 a..z->a..z 。
A..Z/2
棋 盘范围映射。映射每相邻两个字符到其中的第二个。形式化地说,声明范围中的奇数字符为允许,将它们映射到偶数字符上。同时允许偶数字符并映射到其自身。例 如, A..Z/2 相当于 A->B, B->B, C->D, D->D, ..., Y->Z, Z->Z。这个映射接将捷径方便声明大小写字符交替而非大小写字符分别连续的Unicode块。

编码为0到31之间的控制字符总是被视作分隔符。编码32到127的字符即7位ASCII字符可以原样使用在映射中。为避免配置文件的编码问题,8 位ASCII字符和Unicode字符必须以U+xxx形式指定,“xxx”是码点对应的十六进制数。也可以用这个形式编码7位ASCII编码中的特殊字 符,例如用U+20来编码空格符,U+2E来编码句点,U+2C来编码逗号。

示例:

# 'sbcs' defaults for English and Russian
charset_table = 0..9, A..Z->a..z, _, a..z, \
U+A8->U+B8, U+B8, U+C0..U+DF->U+E0..U+FF, U+E0..U+FF
# 'utf-8' defaults for English and Russian
charset_table = 0..9, A..Z->a..z, _, a..z, \
U+410..U+42F->U+430..U+44F, U+430..U+44F

9.2.14.ignore_chars

忽略字符表。 可选选项,默认为空。

有些字符,如软断字符(U+00AD),不是仅仅要当作分隔符,而且应该被完全忽略。例如,如果“-”只是不在charset_table里,那么 “abc-def”会被当作两个关键字“abc”和“def”来索引。相反,如果将“-”加到ignore_char列表中,那么相同的文本会被当作一个 单独的关键字“abcdef”索引。

此选项的语法与charset_table相同,但只允许声明字符,不允许映射它们。另外,忽略的字符不能出现在charset_table里。

示例:

ignore_chars = U+AD

9.2.15.min_prefix_len

索引的最小前缀长度。可选选项,默认为0(不索引前缀)。

前缀索引使实现“wordstart*”形式的通配符成为可能(通配符语法的细节请参考enable_star选项)。当最小前缀长度被设置为正值,indexer除了关键字本身还会索引所有可能的前缀(即词的开头部分)。太短的前缀(小于允许的最小值)不会被索引。

例如,在min_prefix_len=3设置下索引关键字“example”会导致产生5个索引项“exa”, “exam”, “examp”, “exampl”和该词本身。对这个索引搜索“exam”会得到包含“example”的文档,即使该文档中没有“exam”自身。然而,前缀索引会使索 引体积急剧增大(因为待索引关键字增多了很多),而且索引和搜索的时间皆会恶化。

在前缀索引中没有自动的办法可以提高精确匹配(整个词完全匹配)的评分,但有一些技巧可以实现这个功能。首先,可以建立两个索引,一个带有前缀索引,另一个没有,同时在这两个索引中搜索,然后用SetIndexWeights()来设置二者的权重。其次,可以启用星号语法并重写扩展模式的查询:

# in sphinx.conf
enable_star = 1
// in query
$cl->Query ( "( keyword | keyword* ) other keywords" );

示例:

min_prefix_len = 3

9.2.16.min_infix_len

索引的最小中缀长度。可选选项,默认为0(不索引中缀)。

中缀索引是实现“start*”, “*end”, and “*middle*”等形式的通配符成为可能(通配符语法的细节请参考enable_star选项)。当最小中缀长度设置为正值,indexer除了对关键字本身还会对所有可能的中缀(即子字符串)做索引。太短的中缀(短于允许的最小长度)不会被索引。

例如,在min_infix_len=2设置下索引关键字“test”会导致产生6个索引项 "te", "es", "st", "tes", "est"等中缀和词本身。对此索引搜索“es”会得到包含“test”的文档,即使它并不包含“es”本身。然而,中缀索引会使索引体积急剧增大(因为 待索引关键字增多了很多),而且索引和搜索的时间皆会恶化。

在中缀索引中没有自动的办法可以提高精确匹配(整个词完全匹配)的评分,但可以使用与prefix indexes选项中相同的技巧。

示例:

min_infix_len = 3

9.2.17.prefix_fields

做前缀索引的字段列表。可选选项,默认为空(所有字段均为前缀索引模式)。

因为前缀索引对索引和搜索性能均有影响,可能需要将它限制在某些特定的全文数据字段:例如,对URL提供前缀索引,但对页面内容不提供。prefix_fields指定哪些字段要提供前缀索引,其他字段均会使用普通模式。值的格式是逗号分隔的字段名字列表。

示例:

prefix_fields = url, domain

9.2.18.infix_fields

做中缀索引的字段列表。可选选项,默认为空(所有字段均为中缀索引模式)。

与prefix_fields选项类似,但限制的是哪些字段做中缀索引。

示例:

infix_fields = url, domain

9.2.19.enable_star

允许前缀/中缀索引上的星号语法(或称通配符)。可选选项,默认为0(不使用通配符),这是为了与0.9.7版本的兼容性。已知的值为0和1。

此特性启用搜索前缀或中缀索引时的“星号语法”,或者说通配符语法。仅影响搜索,因此要使改变生效只须重启searchd,而不需要重新索引。

默认值为0,意思是禁止星号语法,所有关键字都根据索引时的min_prefix_len和min_infix_len settings设置被视为前缀或者中缀。取值1的意思是星号(“*”)可以用在关键字的前面或后面。星号与零个或多个字符匹配。

例如,假设某索引启用了中缀索引,且enable_star值为1。搜索过程按如下工作:

  1. 查询 "abcdef" 仅匹配确切含有“abcdef”这个词的文档;
  2. 查询 "abc*" 可匹配含有以“abc”开头的词的文档(包括精确匹配词“abc”的文档);
  3. 查询 "*cde*" 匹配在任何地方含有“cde”的词的文档(包括精确匹配词“cde”的文档);
  4. 查询 "*def" 匹配含有以“def”结束的词的文档(包括精确匹配词“def”的文档)

示例:

enable_star = 1

9.2.20.ngram_len

n-gram索引的n-gram长度。可选选项,默认为0(禁用n-gram索引)已知的值是0和1(其他长度尚未实现)对于使用Coreseek的中文用户,在启用了中文分词的情况下,本节内容可忽略。

n-gram提供对未分词CJK(Chinese, Japanse, Koreasn中日韩)文本的基本支持。CJK搜索的问题在于词与词之前没有清晰的界限。理想中,文本可以通过一个称作分词程序(segmenter)的 特殊程序的过滤,之后分隔符即被加入到适当位置。然而分词过程缓慢而易错,因此通常会转而索引连续的一组N个字符,或称n-gram。

启用此特性,CJK字符流会被当作n-gram索引。例如,如果输入文本为“ABCDEF”(A到F均代表CJK字符) ,而此选项设置的长度为1,那它们会被当作“A B C D E F”而索引。(如果此选项设置的长度是2,那会产生“AB BC CD DE EF”,但目前仅支持1)。只有那些在ngram_chars选项表中列出的字符会这样分割,其他不受影响。

注意,如果搜索查询是已分词的,即单独的词之间有分隔符分隔,那么在扩展模式中将这些词放入引号中搜索会得到正确的匹配结果,即使文档没有分词。例如,假设原查询为“BC DEF”,在应用程序端用引号将索引包起来,看起来是“BC” “DEF”(包括引号),这个查询被传给Sphinx并在其内部分割成1-gram,查询变成“B C” “D E F”,仍然包括作为词组查询操作符的引号。该查询会匹配正确的文本,即使文本中没有相应的分隔符。

即使搜索查询没有分词,Sphinx也可以返回较好的结果,这要感谢基于词组的相关度计算:它会使相近的词组匹配(在n-gram中CJK词相当于多个字符的词匹配)排在前面。

示例:

ngram_len = 1

9.2.21.ngram_chars

n-gram字符列表。 可选选项,默认为空。对于使用Coreseek的中文用户,在启用了中文分词的情况下,本节内容可忽略。

与ngram_len选项联用,此列表定义了从中抽取n-gram的字符序列。其他字符组成的词不受n-gram索引特性的影响。值的格式与charset_table相同。

示例:

ngram_chars = U+3000..U+2FA1F

9.2.22.phrase_boundary

词组边界符列表。 可选选项,默认为空。

此列表控制哪些字符被视作分隔不同词组的边界,每到一个这样的边界,其后面的词的“位置”值都会被加入一个额外的增量,可以借此用近似搜索符来模拟词组搜索。语法与charset_table选项相似,但没有字符之间的映射关系,而且这些词组边界符不能重复出现在其他任何设置选项中。

自每个词组边界起,后面的词的“位置”都会被加入一个额外的增量(由phrase_boundary_step定 义)。这使通过近似搜索符实现词组搜索成为可能:不同词组中的词之间的距离肯定大于phrase_boundary_step,因此相似距离小于 phrase_boundary_step的近似搜索其实是在搜索在一个词组范围内出现了全部给定查询词的情况,相当于词组搜索。

只有词组边界符后面紧跟着一个分隔符时,词组边界才被激活,这是为了避免S.T.A.L.K.E.R 或 URLs 等缩写被错当成若干个连续的词组(因为“.”属于词组边界符)。

示例:

phrase_boundary = ., ?, !, U+2026 # horizontal ellipsis

9.2.23.phrase_boundary_step

词组边界上词位置的增量。可选选项,默认为0。

在词组边界上,当前词位置会加上此选项设置的额外增量。详细请参考phrase_boundary选项。

示例:

phrase_boundary_step = 100

9.2.24.html_strip

是否从输入全文数据中去除HTML标记。可选标记,默认为0。已知值包括0(禁用)和1(启用)。

此特性对xmlpipe数据源无效(建议升级到 xmlpipe2 )。这个去除HTML标记的模块应该很好地工作于正确格式化的HTML和XHTML,但就像大多数浏览器一样,对于格式错误的文本(例如带有无法配对的<和>的HTML)可能产生不希望的输出。

只有HTML标签和HTML注释会被删除。要同时删除标签的内容(例如要删除内嵌的脚本),请参考html_remove_elements选项。标签名没有限制,即任何看起来像有效的标签开头、结束或者注释的内容都会被删除。

示例:

html_strip = 1

9.2.25.html_index_attrs

去除HTML标记时要索引的标记语言属性列表。可选选项,默认为空(不索引标记语言属性)。

指定被保留并索引的HTML标记语言属性,即使其他HTML标记被删除。格式是对每个标记列举可以索引的属性,请看下例:

示例:

html_index_attrs = img=alt,title; a=title;

9.2.26.html_remove_elements

HTML元素列表,不仅这些元素本身会被删除,它们的中间包括的文字内容也会被删除。可选选项,默认为空串(不删除任何元素的内容)。

此特性允许删除元素的内容,即在开始标记和结束标记之间的所有东西。用于删除内嵌的脚本或CSS等。短格式的元素(即<br />)被适当地支持,即,这种标记后面的内容不会被删除。

值为逗号分隔的标签名称列表。标签名大小写无关。

示例:

html_remove_elements = style, script

9.2.27.local

分布式索引distributed index中的本地索引声明。可以出现多次, 可选选项,默认为空。

此设置用于声明分布式索引被搜索时要搜索的本地索引。全部本地索引会被依次搜索,仅使用1个CPU或核。要并行处理,可以配置searchd查询它自身(细节参考Section9.2.28, “agent”)。可以为每个分布式索引声明多个本地索引。每个本地索引可以在其他分布式索引中多次引用。

示例:

local = chunk1
local = chunk2

9.2.28.agent

分布式索引(distributed index)中的远程代理和索引声明。可以出现多次,可选选项,默认为空。

此设置用来声明搜索分布式索引时要搜索的远程代理。代理可以看作网络指针,它指定了主机、端口和索引名。在最基本的情况下,代理可以与远程物理主机对应。更严格的来说,这不一定总是正确:可以将多个代理指向同一台远程主机,甚至指向同一个searchd实例(以便利用多个CPU或核)

值的格式如下:

agent = specification:remote-indexes-list
specification = hostname ":" port | path

“hostname”是远程主机名,“port”是远程TCP端口,而“remote-index-list”是一个逗号分隔的远程索引列表。

全部代理会被并行搜索。然而同一个代理的多个索引是依次搜索的。这使您可以根据硬件来优化配置。例如,如果两个远程索引存储在一个相同的硬盘上,最 好是配置一个带有多个按顺序搜索的索引,避免频繁的磁头寻址。如果这些索引存储在不同的硬盘上,那配置两个代理会更有利,因为这可以使工作完全并行。对于 CPU也是如此,虽然在两个进程间切换对性能的影响比较小而且常常被完全忽略。

在有多个CPU和硬盘的机器上,代理可以指向相同的机器以便并行地使用硬件,降低查询延迟。并不需要为此设置多个searchd实例,一个实例与自身通信是合法的。以下是一个示例设置,它是为一台有4个CPU的机器准备的,可以并行地使用4个CPU,各处理一个查询:

index dist
{
type = distributed
local = chunk1
agent = localhost:9312:chunk2
agent = localhost:9312:chunk3
agent = localhost:9312:chunk4
}

注意其中一块是本地搜索的,而同一个searchd示例又向本身查询,以便并行地启动其他三个搜索。

示例:

agent = localhost:9312:chunk2 # contact itself
agent = /var/run/searchd.s:chunk2
agent = searchbox2:9312:chunk3,chunk4 # search remote indexes

9.2.29.agent_blackhole

分布式索引(distributed index)中声明远程黑洞代理。多个值,可选选项,默认是空。于版本0.9.9-rc1引入。

agent_blackhole选项使用户可以向远程代理发送“即发即忘”的查询(fire-and-forget queries)。这在调试(或者仅仅是测试)即将投入生产的集群的时候很有用:可以设置一个单独的调试/测试searchd实例,然后从实际生产中使用的主服务器(master,或称聚集者aggregator)实例向这个测试服务器转发查询请求,但不干扰生产系统的工作。主(master)searchd会以正常的方式尝试连接和查询黑洞代理,但是它既不会等待也不会处理黑洞代理的反馈。同时,发生在黑洞代理上的全部网络错误也都被忽略。值的格式与普通的agent完全相同。

示例:

agent_blackhole = testbox:9312:testindex1,testindex2

9.2.30.agent_connect_timeout

远程代理的连接超时时间,单位为毫秒。可选选项,默认为1000(即1秒)。

连接到远程代理时,searchd最多花这些时间等待connet()调用成功完成。如果达到了超时时间connect()仍没有完成,而 andretries选项是启用的,那么将开始重试。

示例:

agent_connect_timeout = 300

9.2.31.agent_query_timeout

远程代理查询超时时间,以毫秒为单位。可选选项,默认为3000(即3秒)。

连接后,searchd最多花这这些时间等到远程查询完成。这个超时时间与连接超时时间是完全独立的。因此一个远程代理最多能造成的延迟为agent_connection_timeoutagent_query_timeout之和。如果超时时间已到,查询不会再重试,同时产生警告。

示例:

agent_query_timeout = 10000 # our query can be long, allow up to 10 sec

9.2.32.preopen

预先打开全部索引文件还是每次查询时再打开索引。可选选项,默认为0(不预先打开)。

此选项令searchd在启动时(或轮换索引时)预先开打全部索引文件并在运行过程中保持打开。目前,默认是预先打开这些文件(此行为可能在未来改变)。预先打开的每个索引文件会占用若干(目前是两个)文件描述符。但每次查询可以节约两个open()调用而且不会受高负载情况下索引轮换过程中可能发生的微妙的竞争条件(race condition)的影响。另一方面,当提供很多索引服务(几百到几千)时,必须每次查询时打开索引文件以便节约文件描述符。

这个指令不影响indexer的任何行为,只对searchd有用。

示例:

preopen = 1

9.2.33.ondisk_dict

指定是将字典文件(.spi)保持在磁盘上还是将它预先缓冲在内存中。可选选项,默认值是0(预先缓冲在内存里)。于版本0.9.9-rc1引入。

字典文件(.spi)既可以驻留在内存中也可以保持在磁盘上。默认情况下是将整个字典缓冲在内存中。这样做提高性能,但可能带来过大的内存压力,尤其是使用了前缀或中缀的时候。启用ondisk_dict为每次查询的每个关键词带来一次磁盘I/O操作,但是会减少内存使用。

这个指令不影响indexer的任何行为,只对searchd有用。

示例:

ondisk_dict = 1

9.2.34.inplace_enable

是否启用原地索引倒转(in-place index inversion)。可选选项,默认值是0(使用单独的临时文件)。于版本0.9.9-rc1引入。

inplace_enable选项极大地减少了建立索引时的磁盘压力,代价是略慢的索引速度(少使用大约两倍的磁盘空间,速度方面能达到原有性能的90-95%)

建立索引的过程有两个主要的阶段。第一个阶段主要是收集、处理文档以及对文档根据关键词进行部分的排序,中间结果被写入到临时文件(.tmp*) 中。第二个阶段则对文档进行完全排序并创建总重的索引文件。因此,重建一个正在应用于生产的索引将导致一个三倍大的磁盘占用峰值:第一倍,中间结果临时文 件,第二,新建的副本,和第三,在一切发生时旧的索引仍然占用一份磁盘空间,以便继续服务。(中间结果的大小与最终索引的大小相当)。对于很大的数据集, 这将是一笔很大的磁盘开销,而inplace_enable选项用于减少这个开销。一旦启用这个选项,临时文件将被重复利用,最终的数据写回到临时文件中,最后改个名字就可以作为最终结果使用了。然而,这可能导致更多的临时数据块重新分配,因此性能会有一点损失。

这个指令不影响searchd的任何行为,只对indexer有用。

示例:

inplace_enable = 1

9.2.35.inplace_hit_gap

微调原地倒转(In-place inversion)行为的选项。控制预先分配的匹配点列表(hitlist)的空隙的大小。可选选项,默认是0。于版本0.9.9-rc1引入。

这个指令不影响searchd的任何行为,只对indexer有用。

示例:

inplace_hit_gap = 1M

9.2.36.inplace_docinfo_gap

微调原地倒转(In-place inversion)行为的选项。控制预先分配的文档信息(docinfo)的空隙的大小。可选选项,默认是0。于版本0.9.9-rc1引入。

这个指令不影响searchd的任何行为,只对indexer有用。

示例:

inplace_docinfo_gap = 1M

9.2.37.inplace_reloc_factor

微调原地倒转(In-place inversion)行为的选项。控制重定位缓冲区占用索引时的内存的比例。可选选项,默认是0.1。于版本0.9.9-rc1引入。

这个指令不影响searchd的任何行为,只对indexer有用。

示例:

inplace_reloc_factor = 0.1

9.2.38.inplace_write_factor

微调原地倒转(In-place inversion)行为的选项。控制原地写缓冲占用索引时的内存的比例。可选选项,默认是0.1。于版本0.9.9-rc1引入。

这个指令不影响searchd的任何行为,只对indexer有用。

示例:

inplace_write_factor = 0.1

9.2.39.index_exact_words

是否在索引原关键词的词干化/重映射后的形式的同时也索引原词。可选选项,默认值是0(不索引额外的形式)。于版本0.9.9-rc1引入。

一旦启用,index_exact_words强制indexer除了词干化的版本外,将原始的关键字也加入索引。这样做也使查询语言中的精确匹配搜索符可用。这个选项将对索引大小和索引时间带来延迟。然而搜索的性能不会被影响。

示例:

index_exact_words = 1

9.2.40.overshort_step

在经过过短的词(比min_word_len短的词)处后增加位置值。 可选选项,允许的值是0或者1,默认是1。于版本0.9.9-rc1引入。

这个指令不影响searchd的任何行为,只对indexer有用。

示例:

overshort_step = 1

9.2.41.stopword_step

在经过停用词处后增加位置值可选选项,允许的值是0或者1,默认是1。于版本0.9.9-rc1引入。

这个指令不影响searchd的任何行为,只对indexer有用。

示例:

stopword_step = 1