-

Sphinx配置文件详解

MySQL

一般情况下要实现全文索引的功能,我们一定会想到他–Sphinx,今天主要讲解下Sphinx配置文件。Sphinx的配置文件主要包含以下几个部分:source:数据源。index:索引,索引实际上就是相当于一个字典检索。searchd:提供搜索查询服务。它一般是以deamon的形式运行在后台的。indexer:构建索引的服务。attr:属性,属性是存在索引中的,它不进行全文索引,但是可以用于过滤和排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
## 数据源src1
source src1
{
## 说明数据源的类型。数据源的类型可以是:mysql,pgsql,mssql,xmlpipe,odbc,python
type = mysql

## 下面是<a href="https://www.xuesongboke.cn/category/mysql" target="_blank">mysql数据库</a>特有的端口,用户名,密码,数据库名等。
sql_host = localhost
sql_user = raykaeso
sql_pass =
sql_db = test
sql_port = 3306

## 如果是使用unix sock连接可以使用这个。
# sql_sock = /tmp/mysql.sock

## indexer和mysql之间的交互,需要考虑到效率和安全性。
## 比如考虑到效率,他们两者之间的交互需要使用压缩协议;考虑到安全,他们两者之间的传输需要使用ssl连接
## 那么这个参数就代表这个意思,0/32/2048/32768/使用压缩协议/握手后切换到ssl/Mysql 4.1版本身份认证。
# mysql_connect_flags = 32

## 当mysql_connect_flags设置为2048ssl)的时候,下面几个就是MySQL ssl连接所需要的参数。
# mysql_ssl_cert = /etc/ssl/client-cert.pem
# mysql_ssl_key = /etc/ssl/client-key.pem
# mysql_ssl_ca = /etc/ssl/cacert.pem

## odbc的dsn串
# odbc_dsn = DBQ=C:\data;DefaultDir=C:\data;Driver={Microsoft Text Driver (*.txt; *.csv)};

## sql某一列的缓冲大小,一般是针对字符串来说的。有的字符串,虽然长度很长,但是实际上并没有使用那么长的字符,所以在Sphinx并不会收录所有的字符,而是给每个属性一个缓存作为长度限制。
## 默认情况下非字符类型的属性是1KB,字符类型的属性是1MB。
# sql_column_buffers = content=12M, comments=1M

## indexer的sql执行前需要执行的操作。
# sql_query_pre = SET NAMES utf8
# sql_query_pre = SET SESSION query_cache_type=OFF

## indexer的sql执行语句
sql_query = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents

## 有的时候有多个表,我们想要查询的字段在其他表中。这个时候就需要对sql_query进行join操作。
## 而这个join操作可能非常慢,导致建立索引的时候特别慢,那么这个时候,就可以考虑在sphinx端进行join操作了。
## sql_joined_field是增加一个字段,这个字段是从其他表查询中查询出来的。
## 这里封号后面的查询语句是有要求的,如果是query,则返回id和查询字段,如果是payload-query,则返回id,查询字段和权重。
## 并且这里的后一个查询需要按照id进行升序排列。
# sql_joined_field = tags from query; SELECT docid, CONCAT('tag',tagid) FROM tags ORDER BY docid ASC
# sql_joined_field = wtags from payload-query; SELECT docid, tag, tagweight FROM tags ORDER BY docid ASC

## 外部文件字段,意思就是一个表中,有一个字段存的是外部文件地址,但是实际的字段内容在文件中。比如这个字段叫做content_file_path。
## 当indexer建立索引的时候,查到这个字段,就读取这个文件地址,然后加载,并进行分词和索引建立等操作。
# sql_file_field = content_file_path

## 当数据源数据太大的时候,一个sql语句查询下来往往很有可能锁表等操作。
## 那么我么就可以使用多次查询,那么这个多次查询就需要有个范围和步长,sql_query_range和sql_range_step就是做这个使用的。
## 获取最大和最小的id,然后根据步长来获取数据。比如下面的例子,如果有4500条数据,这个表建立索引的时候就会进行5次sql查询。
## 而5次sql查询每次的间隔时间是使用sql_ranged_rhrottle来进行设置的。单位是毫秒。
# sql_query_range = SELECT MIN(id),MAX(id) FROM documents
# sql_range_step = 1000
# sql_ranged_throttle = 0

## 下面都是些不同属性的数据了,属性是存在索引中的,它不进行全文索引,但是可以用于过滤和排序。

## uint无符号整型属性
sql_attr_uint = group_id

## bool属性
# sql_attr_bool = is_deleted

## 长整型属性
# sql_attr_bigint = my_bigint_id

## 时间戳属性,经常被用于做排序
sql_attr_timestamp = date_added

## 字符串排序属性。一般我们按照字符串排序的话,我们会将这个字符串存下来进入到索引中,然后在查询的时候比较索引中得字符大小进行排序。
## 但是这个时候索引就会很大,于是我们就想到了一个方法,我们在建立索引的时候,先将字符串值从数据库中取出,暂存,排序。
## 然后给排序后的数组分配一个序号,然后在建立索引的时候,就将这个序号存入到索引中去。这样在查询的时候也就能完成字符串排序的操作。
## 这,就是这个字段的意义。
# sql_attr_str2ordinal = author_name

## 浮点数属性,经常在查询地理经纬度的时候会用到。
# sql_attr_float = lat_radians
# sql_attr_float = long_radians

## 多值属性(MVA)
## 试想一下,有一个文章系统,每篇文章都有多个标签,这个文章就叫做多值属性。
## 我要对某个标签进行查询过滤,那么在建立查询的时候就应该把这个标签的值放入到索引中。
## 这个字段,sql_attr_multi就是用来做这个事情的。
# sql_attr_multi = uint tag from query; SELECT docid, tagid FROM tags
# sql_attr_multi = uint tag from ranged-query; \
# SELECT docid, tagid FROM tags WHERE id>=$start AND id<=$end; \
# SELECT MIN(docid), MAX(docid) FROM tags

## 字符串属性。
# sql_attr_string = stitle

## 文档词汇数记录属性。比如下面就是在索引建立的时候增加一个词汇数的字段
# sql_attr_str2wordcount = stitle

## 字符串字段,可全文搜索,可返回原始文本信息。
# sql_field_string = author

## 文档词汇数记录字段,可全文搜索,可返回原始信息
# sql_field_str2wordcount = title

## 取后查询,在sql_query执行后立即操作。
## 它和sql_query_post_index的区别就是执行时间不同
## sql_query_post是在sql_query执行后执行,而sql_query_post_index是在索引建立完成后才执行。
## 所以如果要记录最后索引执行时间,那么应该在sql_query_post_index中执行。
# sql_query_post =

## 参考sql_query_post的说明。
# sql_query_post_index = REPLACE INTO counters ( id, val ) \
# VALUES ( 'max_indexed_id', $maxid )

## 命令行获取信息查询。
## 我们进行索引一般只会返回主键id,而不会返回表中的所有字段。
## 但是在调试的时候,我们一般需要返回表中的字段,那这个时候,就需要使用sql_query_info。
## 同时这个字段只在控制台有效,在api中是无效的。
sql_query_info = SELECT * FROM documents WHERE id=$id

## 比如有两个索引,一个索引比较旧,一个索引比较新,那么旧索引中就会有数据是旧的。
## 当我要对两个索引进行搜索的时候,哪些数据要按照新的索引来进行查询呢。
# sql_query_killlist = SELECT id FROM documents WHERE edited>=@last_reindex

## 下面几个压缩解压的配置都是为了一个目的:让索引重建的时候不要影响数据库的性能表现。
## SQL数据源解压字段设置
# unpack_zlib = zlib_column
## MySQL数据源解压字段设置
# unpack_mysqlcompress = compressed_column
# unpack_mysqlcompress = compressed_column_2
## MySQL数据源解压缓冲区设置
# unpack_mysqlcompress_maxsize = 16M
## xmlpipe的数据源就是一个xml文档
# type = xmlpipe

## 读取数据源的命令
# xmlpipe_command = cat /usr/local/sphinx/var/test.xml

## 字段
# xmlpipe_field = subject
# xmlpipe_field = content

## 属性
# xmlpipe_attr_timestamp = published
# xmlpipe_attr_uint = author_id

## UTF-8修复设置
## 只适用xmlpipe2数据源,数据源中有可能有非utf-8的字符,这个时候解析就有可能出现问题
## 如果设置了这个字段,非utf-8序列就会全部被替换为空格。
# xmlpipe_fixup_utf8 = 1
}

## sphinx的source是有继承这么一种属性的,意思就是除了父source之外,这个source还有这个特性
source src1throttled : src1
{
sql_ranged_throttle = 100
}

## 索引test1
index test1
{
## 索引类型,包括有plain,distributed和rt。分别是普通索引/分布式索引/增量索引。默认是plain。
# type = plain

## 索引数据源
source = src1
## 索引文件存放路径
path = /usr/local/sphinx/var/data/test1

## 文档信息的存储模式,包括有none,extern,inline。默认是extern。
## docinfo指的就是数据的所有属性(field)构成的一个集合。
## 首先文档id是存储在一个文件中的(spa)
## 当使用inline的时候,文档的属性和文件的id都是存放在spa中的,所以进行查询过滤的时候,不需要进行额外操作。
## 当使用extern的时候,文档的属性是存放在另外一个文件(spd)中的,但是当启动searchd的时候,会把这个文件加载到内存中。
## extern就意味着每次做查询过滤的时候,除了查找文档id之外,还需要去内存中根据属性进行过滤。
## 但是即使这样,extern由于文件大小小,效率也不低。所以不是有特殊要求,一般都是使用extern
docinfo = extern

## 缓冲内存锁定。
## searchd会讲spa和spi预读取到内存中。但是如果这部分内存数据长时间没有访问,则它会被交换到磁盘上。
## 设置了mlock就不会出现这个问题,这部分数据会一直存放在内存中的。
mlock = 0

## 词形处理器
## 词形处理是什么意思呢?比如在英语中,dogs是dog的复数,所以dog是dogs的词干,这两个实际上是同一个词。
## 所以英语的词形处理器会讲dogs当做dog来进行处理。
morphology = none

## 词形处理有的时候会有问题,比如将gps处理成gp,这个设置可以允许根据词的长度来决定是否要使用词形处理器。
# min_stemming_len = 1

## 词形处理后是否还要检索原词?
# index_exact_words = 1

## 停止词,停止词是不被索引的词。
# stopwords = /usr/local/sphinx/var/data/stopwords.txt

## 自定义词形字典
# wordforms = /usr/local/sphinx/var/data/wordforms.txt

## 词汇特殊处理。
## 有的一些特殊词我们希望把它当成另外一个词来处理。比如,c++ => cplusplus来处理。
# exceptions = /usr/local/sphinx/var/data/exceptions.txt

## 最小索引词长度,小于这个长度的词不会被索引。
min_word_len = 1

## 字符集编码类型,可以为sbcs,utf-8。对于Coreseek,还可以有zh_cn.utf-8,zh_ch.gbk,zh_ch.big5
charset_type = sbcs

## 字符表和大小写转换规则。对于Coreseek,这个字段无效。
# 'sbcs' default value is
# 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'

来源:Sphinx配置文件详解

发表回复

您的电子邮箱地址不会被公开。