sphinx的配置:
其结构组成主要如下:
Source 源名称1{ //指定数据源
一些配置
}
Index 索引名称1{
Source=源名称1
}
Source 源名称2{
一些配置
}
Index 索引名称2{
Source=源名称2
}
Indexer{
mem_limit = 32M
}
Searchd{ //配置 searchd 守护程序本身
}
二. Source 源名称 相关配置说明
Type=数据库类型(Mysql 或SQL);
Sql_host= 数据库主机地址(如果是外网,请确保防火墙允许链接)
Sql_user= 数据库用户名
Sql_pass= 数据库密码
Sql_db= 数据库名称
Sql_port= 数据库端口
Sql_query_pre= 执行SQL前设置的编码 (SET NAMES UTF8)
Sql_query= 全文检索要显示的内容,据官方说法:尽可能不要使用WHERE或GROUPBY ,将其交给SPHINX效率会更高;select 出来的字段必须包含至少一个唯一主键,以及全文检索的字段 sphinx 会对SELECT 中的 字段1 ,字段2 建立sphinx自己的索引 及 在查询的字段中查找关键字
- Sql_query_info= SELECT * FROM Inventory WHERE id=$id 来查找匹配记录 在查询中,$id 被替换为 searchd 返回的每个主键 (调试是使用 建议注释此项)
Strip_html= 0/1 是否去掉HTML标签
Sql_attr_uint= 无符号整数属性,可以设置多个,设置数据库字段,设置哪个能显示出哪个字段数据的整形来.
三. Index中配置说明
Source= 数据源名称
Path = 索引记录存放目录,注:d:/sphinx/data/cg 这个的意思是 在data目录下创建一个名为cg的文件
min_word_len= 索引的词的最小长度 设为1 既可以搜索单个字节搜索,越小 索引越精确,但建立索引花费的时间越长
charset_type= utf-8/gbk 设置数据编码
charset_table= 字符表和大小写转换规则 .频繁应用于sphinx的分词过程
min_prefix_len = 最小前缀(0)
min_infix_len = 最小中缀(1)
ngram_len = 对于非字母型数据的长度切割(默认已字符和数字切割,设置1为按没个字母切割)
四. searchd配置说明
port= sphinx的端口(9312 与 searchd.exe监听结果一致)
log= 服务进程日志存放路径,一旦sphinx出现异常,基本上可以从这里查询有效信息
query_log= 客户端查询日志 尤为有用 它将在运行时显示每次搜索并显示结果
read_timeout= 请求超时(5)
max_children= 同时可执行的最大searchd 进程数(30)
pid_file= 进程ID文件
max_matches= 查询结果的最大返回数
seamless_rotate= 是否支持无缝切换,做增量索引时通常需要(0/1)
# 在启动运行时是否提前加载所有索引文件
preopen_indexes = 0
# 是否释放旧的索引文件
unlink_old = 1
# MVA跟新池大小(默认为1M)
mva_updates_pool = 1M
# 最大允许的网络包大小(默认8M)
max_packet_size = 8M
# 每个查询最大允许的过滤器数量(默认256)
max_filters = 256
#每个过滤器最大允许的值的个数(默认4096)
max_filter_values = 4096
# 每个组的最大查询数(默认为32)
max_batch_queries = 32
至此 spninx.conf 配置文件结束;注意:如果有换行 必须用反斜杠 链接
配置案例:
- #定义一个数据源
- source search_main
- {
- #定义数据库类型
- type = mysql
- #定义数据库的IP或者计算机名
- sql_host = localhost
- #定义连接数据库的帐号
- sql_user = root
- #定义链接数据库的密码
- sql_pass = test123
- #定义数据库名称
- sql_db = test
- #定义连接数据库后取数据之前执行的SQL语句
- sql_query_pre = SET NAMES utf8
- sql_query_pre = SET SESSION query_cache_type=OFF
- #创建一个sph_counter用于增量索引
- sql_query_pre = CREATE TABLE IF NOT EXISTS sph_counter
- ( counter_id INTEGER PRIMARY KEY NOT NULL,max_doc_id INTEGER NOT NULL)
- #取数据之前将表的最大id记录到sph_counter表中
- sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(searchid) FROM v9_search
- #定义取数据的SQL,第一列ID列必须为唯一的正整数值
- sql_query = SELECT searchid,typeid,id,adddate,data FROM v9_search where
- searchid<( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
- and searchid>=$start AND searchid<=$end
- # sql_attr_uint和sql_attr_timestamp用于定义用于api过滤或者排序,写多行制定多列
- sql_attr_uint = typeid
- sql_attr_uint = id
- sql_attr_timestamp = adddate
- #分区查询设置
- sql_query_range = SELECT MIN(searchid),MAX(searchid) FROM v9_search
- #分区查询的步长
- sql_range_step = 1000
- #设置分区查询的时间间隔
- sql_ranged_throttle = 0
- #用于CLI的调试
- sql_query_info = SELECT * FROM v9_search WHERE searchid=$id
- }
- #定义一个增量的源
- source search_main_delta : search_main
- {
- sql_query_pre = set names utf8
- #增量源只查询上次主索引生成后新增加的数据
- #如果新增加的searchid比主索引建立时的searchid还小那么会漏掉
- sql_query = SELECT searchid,typeid,id,adddate,data FROM v9_search where
- searchid>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
- and searchid>=$start AND searchid<=$end
- sql_query_range = SELECT MIN(searchid),MAX(searchid) FROM v9_search where
- searchid>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
- }
-
- #定义一个index_search_main索引
- index index_search_main
- {
- #设置索引的源
- source = search_main
- #设置生成的索引存放路径
- path = /usr/local/coreseek/var/data/index_search_main
- #定义文档信息的存储模式,extern表示文档信息和文档id分开存储
- docinfo = extern
- #设置已缓存数据的内存锁定,为0表示不锁定
- mlock = 0
- #设置词形处理器列表,设置为none表示不使用任何词形处理器
- morphology = none
- #定义最小索引词的长度
- min_word_len = 1
- #设置字符集编码类型,我这里采用的utf8编码和数据库的一致
- charset_type = zh_cn.utf-8
- #指定分词读取词典文件的位置
- charset_dictpath = /usr/local/mmseg3/etc
- #不被搜索的词文件里表。
- stopwords = /usr/local/coreseek/var/data/stopwords.txt
- #定义是否从输入全文数据中取出HTML标记
- html_strip = 0
- }
- #定义增量索引
- index index_search_main_delta : index_search_main
- {
- source = search_main_delta
- path = /usr/local/coreseek/var/data/index_search_main_delta
- }
-
- #定义indexer配置选项
- indexer
- {
- #定义生成索引过程使用索引的限制
- mem_limit = 512M
- }
-
- #定义searchd守护进程的相关选项
- searchd
- {
- #定义监听的IP和端口
- #listen = 127.0.0.1
- #listen = 172.16.88.100:3312
- listen = 3312
- listen = /var/run/searchd.sock
- #定义log的位置
- log = /usr/local/coreseek/var/log/searchd.log
- #定义查询log的位置
- query_log = /usr/local/coreseek/var/log/query.log
- #定义网络客户端请求的读超时时间
- read_timeout = 5
- #定义子进程的最大数量
- max_children = 300
- #设置searchd进程pid文件名
- pid_file = /usr/local/coreseek/var/log/searchd.pid
- #定义守护进程在内存中为每个索引所保持并返回给客户端的匹配数目的最大值
- max_matches = 100000
- #启用无缝seamless轮转,防止searchd轮转在需要预取大量数据的索引时停止响应
- #也就是说在任何时刻查询都可用,或者使用旧索引,或者使用新索引
- seamless_rotate = 1
- #配置在启动时强制重新打开所有索引文件
- preopen_indexes = 1
- #设置索引轮转成功以后删除以.old为扩展名的索引拷贝
- unlink_old = 1
- # MVA更新池大小,这个参数不太明白
- mva_updates_pool = 1M
- #最大允许的包大小
- max_packet_size = 32M
- #最大允许的过滤器数
- max_filters = 256
- #每个过滤器最大允许的值的个数
- max_filter_values = 4096
- }
sphinx的管理命令:
1. 生成全部索引
/usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf –all
若此时searchd守护进程已经启动,那么需要加上—rotate参数:
/usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf --all --rotate
2. 启动searchd守护进程
/usr/local/sphinx/bin/searchd --config /usr/local/sphinx/etc/sphinx.conf
3. 生成主索引
写成shell脚本,添加到crontab任务,设置成每天凌晨1点的时候重建主索引
/usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf --rotate index_search_main
4. 生成增量索引
写成shell脚本,添加到crontab任务,设置成每10分钟运行一次
/usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf --rotate index_search_main_delta
5. 增量索引和主索引的合并
写成shell脚本,添加到计划任务,每15分钟跑一次
/usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf --merge index_search_main index_search_main_delta --rotate
6. 使用search命令在命令行对索引进行检索
/usr/local/sphinx/bin/search --config /usr/local/sphinx/etc/sphinx.conf