项目配置文件详解

1. 基础说明

  • 项目配置是一个 Xunsearch 项目的核心灵魂,非常重要,通常保存为 .ini 文件
  • 以分号开头的行表示注释,空行直接被忽略不起任何作用
  • 中括号包围的每个分区均为字段配置,字段个数根据项目的实际需求设定
  • 每个项目必须有并且只能有一个类型类 ID 的主键字段,ID 字段值的字母不区分大小写2. 项目设置

项目名称

要求用纯小写字母和小划线组成,长度控制在 2-31 个字符,这也是 xunsearch服务器内用于保存索引数据的目录名称, 所以同一 xunsearch 服务器内的不同项目名称不可重复。默认为不含后缀的配置文件名,如:xyz.ini 则项目名默认为 xyz

  1. project.name = AppName
  • 默认字符集

这里的默认字符集范围涵盖服务端交互时的输入数据、输出数据,实际使用时索引文档、检索服务器仍可重新指定字符集

  1. project.default_charset = UTF-8
  • 服务器连接参数

服务端连接参数的格式包含 3 种格式:

  • 端口号(数字),连接 localhost 的该端口号 (例:8383)
  • 地址:端口号,冒号连接地址(域名、IP地址)和端口 (例:127.0.0.1:8383)
  • 文件路径,本机的 unix socket 连接路径 (例:/tmp/index.sock)
  1. ; 索引服务端配置,默认值为 8383
  2. server.index = 8383
  3. ; 搜索服务端配置,默认值为 8384
  4. server.search = 8384

Note:1.4.7 起,服务端地址可以使用 ; 分隔指定多个。 索引更新将同步到所有服务端,而搜索则随机从中挑选一个可用的服务端以达到均横效果。

3. 项目字段设计每个搜索项目均可以简单地理解为单表检索,凡是涉及关联表的,请将关联记录转换为搜索项目的新字段并设置对应的分词规则。字段设计很重要,请仔细根据需求创建,字段名建议和您的实际数据库字段一致。

  • 定义字段

每个字段用一个区段配置来表示,中括号内的名字即为字段名。每个项目包含若干个字段,具体由项目搜索需求决定,并不需要一味的与实际源数据库 (如 MYSQL) 一致,而只需要设计搜索功能所涉及的字段即可。

  1. [field_name]
  • 字段选项

每个字段根据实际情况指定字段选项,所有选项均有默认值,所以即便不指定任何选项而只有中括号定义的字段,那也是一个合法的字段,字段选项包括以下几种:

type 字段类型

  • string 字符型,适用多数情况,也是默认值
  • numeric 数值型,包含整型和浮点数,仅当字段需用于以排序或区间检索时才设为该类型,否则请使用 string 即可
  • date 日期型,形式为 YYYYmmdd 这样固定的 8 字节,如果没有区间检索或排序需求不建议使用
  • id 主键型,确保每条数据具备唯一值,是索引更新和删除的凭据,每个搜索项目必须有且仅有一个 id 字段,该字段的值不区分大小写
  • title 标题型,标题或名称字段,至多有一个该类型的字段
  • body 内容型,主内容字段, 即本搜索项目中内容最长的字段,至多只有一个该类型字段,本字段不支持字段检索
  1. type = string

index 索引方式

xunsearch 的索引有 2 种模式:其一是不标明字段的检索,称之为“混合区检索”;其二是标明特定字段的“字段检索”。例如:搜索 XXX YYY 表示在混合区检索,返回的结果可能是 title 也有可能是 body 字段符合匹配;而搜索 title:XXX 则表示仅检索 title 匹配 XXX 的数据。每个字段可以指定的索引方式的值如下:

  • none 不做索引,所有的搜索匹配均与本字段无关,这个字段只用于排序或搜索结果展示用到。
  • self 字段索引,可以在搜索时用 field:XXX 来检索本字段
  • mixed 混合区索引,不标明字段的默认搜索也可以检索本字段
  • both 相当于 self + mixed,两种情况均索引通常情况默认值为 none ,但 id 型字段默认是 self ,title 型字段是 both ,body 型字段则固定为 mixed 。
  1. index = none

tokenizer 分词器

默认为 default 采用内置的功能强大的 scws 分词,适合绝大多数字符串字段。也可以指定自定义分词器,格式为 name 或 name(arg) 两种形式,其中 name 是分词器名称,arg 则是传递给分词器构造函数的参数。自定义分词器需要在 lib/ 目录下编写名为 XSTokenizerName 的分词类并实现接口 XSTokenizer,内置支持的分词器有以下几种:

  • full 表示本字段的值整体作为一个检索词,像各种 ID 都适合这种情况
  • none 表示本字段没有任何词汇用于索引
  • split([ ]) 表示根据参数分割内容,默认参数为空格,若参数以 / 开头并以 / 结尾则 内部调用 preg_split(arg, ..) 来分割取词,以支持正则或其它特殊字符分割
  • xlen([2]) 表示根据指定参数长度分段取词,如 ABCDEF => AB + CD + EF
  • xstep([2]) 表示根据指定参数步长逐段取词,如 ABCDEF => AB + ABCD + ABCDEF
  • scws([3]) 表示采用指定参数为复合等级的 scws 分词,(若无特殊复合需求,无需指定)
  1. tokenizer = default

Note: 小括号内的值表示参数,中括号表示省略后的默认值,实际编写请勿照抄中括号!!!

cutlen 搜索结果摘要截取长度

默认值为 0 表示不截取。主要是针对某些内容特别长的字段在返回结果时自动剪取包含关键词的一小段文字。典型的是 body 型字段默认为 300 。长度单位是字节,通常 UTF-8 编码的一个汉字为 3 个字节。

  1. cutlen = 0

weight 混合区检索时的概率权重

在混合检索时,可以对标题和内容等不同字段进行权重计算,如果你不想该字段参与计算权重可设为 0 。通常默认值为 1 ,但 title 型默认为 5 而 body 型则固定为 1 。

  1. weight = 1

phrase 是否支持精确检索

即当给搜索语句加上引号时,则要求匹配的结果必须严格按照搜索词的顺序匹配,此外还支持用 NEAR 之类的语法来做精确检索,具体参见:搜索技巧 。通常默认值为 no 但是 title 和 body 型字段默认则为 yes 。值得注意的是该功能仅支持默认分词器,如非必要请勿开启此项,因为这会增加索引数据的大小。

  1. phrase = no

non_bool 强制指定是否为布尔索引

布尔索引不参与权重排名计算,默认情况下所有自定义分词器的字段均为布尔索引。因此,当您使用自定义分词器却又想让本字段参与权重计算的话,请将本项设为 yes。

  1. non_bool = yes

4. 配置示例文件下面是 discuz 搜索项目的配置示范文件,包含 12 个字段。其中可以看到 tidfid 虽然从内容上讲它们都是数字型,但没有排序需求所以仍应为 string 类型,而 dateline 由于有排序需求,所以必须指定为 numeric 类型。

  1. project.name = sample
  2. project.default_charset = GBK
  3. ;server.index = 8383
  4. ;server.search = 8384
  5.  
  6. [pid]
  7. type = id
  8.  
  9. [subject]
  10. type = title
  11.  
  12. [message]
  13. type = body
  14.  
  15. [dateline]
  16. type = numeric
  17.  
  18. [author]
  19. index = both
  20.  
  21. [authorid]
  22.  
  23. [tid]
  24. index = self
  25. tokenizer = full
  26.  
  27. [fid]
  28. index = self
  29. tokenizer = full
  30.  
  31. [flag]