1. 直接在 http://sphinxsearch.com/downloads/release/ 找 到最新的 windows 版本,我这里下的是 Win64 binaries w/MySQL+PgSQL+libstemmer+id64 support,下载后解压在 D:\sphinx 目录下;
2. 在 D:\sphinx\ 下新建一个 data 目录用来存放索引文件, 一个 log 目录存放日志文件,复制 D:\sphinx\sphinx.conf.in 到 D:\sphinx\bin\sphinx.conf (注意修改文件 名);
3. 修改 D:\sphinx\bin\sphinx.conf ,按网上的博客列举的这里 列出需要修改的几个:
type = mysql # 数据源,我这里是mysql
sql_host = localhost # 数据库服务器
sql_user = root # 数据库用户名
sql_pass = '' # 数据库密码
sql_db = test # 数据库
sql_port = 3306 # 数据库端口
sql_query_pre = SET NAMES utf8 # 去掉此行前面的注释,如果你的数据库是uft8 编码的
index test1
{
# 放索引的目录
path = D:/sphinx/data/
关于charset_type设置的两个配置,这里2.2.9不需要修改,如果是2.06是需要修改的
# 简单分词,只支持0 和1 ,如果要搜索中文,请指定为1
ngram_len = 1
# 需要分词的字符,如果要搜索中文,去掉前面的注释
ngram_chars = U+3000..U+2FA1F
}
# 搜索服务需要修改的部分
searchd
{
# 日志
log = D:/sphinx/log/searchd.log
# PID file, searchd process ID file name
pid_file = D:/sphinx/log/searchd.pid
# windows 下启动searchd 服务一定要注释掉这个
# seamless_rotate = 1
}
4. 建立索引
D:\sphinx\bin>indexer.exe test1 --备注 :test1 为 sphinx.conf 的 index test1
报错
修改其中的配置文件变量为绝对路径d:/sphinx/data,测试通过,又报错:
在主配置中有以下内容:
# main document fetch query # mandatory, integer document ID field MUST be the first selected column sql_query= \ SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \ FROM documents |
说明是默认要查询documents中的表
但我查询的并不是shpihx自己提供的数据,所以做修改:
# main document fetch query # mandatory, integer document ID field MUST be the first selected column sql_query= \ SELECT article_id, article_camp_team_id, UNIX_TIMESTAMP(add_time) AS date_added, title, content \ FROM cms_article |
重新索引:
有一个警告,再看一下:
# unsigned integer attribute declaration # multi-value (an arbitrary number of attributes is allowed), optional # optional bit size can be specified, default is 32 # # sql_attr_uint= author_id # sql_attr_uint= forum_id:9 # 9 bits for forum_id sql_attr_uint= group_id # UNIX timestamp attribute declaration # multi-value (an arbitrary number of attributes is allowed), optional # similar to integer, but can also be used in date functions # # sql_attr_timestamp= posted_ts # sql_attr_timestamp= last_edited_ts sql_attr_timestamp= date_added |
我们已经不再使用 group_id做属性单位了。还有sql_attr_timestamp时间属性。
修改一下:
# unsigned integer attribute declaration # multi-value (an arbitrary number of attributes is allowed), optional # optional bit size can be specified, default is 32 # # sql_attr_uint= author_id # sql_attr_uint= forum_id:9 # 9 bits for forum_id #sql_attr_uint= group_id sql_attr_uint= article_id:11 #11 bits for article_id # UNIX timestamp attribute declaration # multi-value (an arbitrary number of attributes is allowed), optional # similar to integer, but can also be used in date functions # # sql_attr_timestamp= posted_ts # sql_attr_timestamp= last_edited_ts #sql_attr_timestamp= date_added sql_attr_timestamp= add_time |
重新索引:
还是不对,报修改的属性没找到
Add_time确实是在写SQL时写错别名了,修改后重新索引:
还是报article_id没有找到,我修改为article_camp_team_id后可以正常通过索引:
但一使用 article_id时就异常。
网上查这个字段的作用:
问题一:sql_attr_uint这些设置对生成索引有什么用处?
属性字段,以前用在where,orderby,groupby中的一些字段要在这里定义
问题二:这个配置和查询的时候的where是没有关系的吧?
没有关系。
他们是用来过滤信息的。使用Filter来过滤。
sql_attr_uint这些设置是必要的,否则就是全文索引了。
且对id字段不可做设置。
5、查询引擎启动:直接运行searched.exe就启动了
JAVA接口调用:
String sphinxHost = 127.0.0.1; int sphinxPort = 9312; logger.debug("sphinxHost." + sphinxHost+"sphinxPort"+sphinxPort); //创建客户端 SphinxClient sphinxClient = new SphinxClient(sphinxHost,sphinxPort); //设置排序模式,根据排序属性排序,属性指定 为group_id //SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面) //SPH_SORT_ATTR_DESC 模式, 按属性降序排列 (属性值越大的越是排在前面) //SPH_SORT_ATTR_ASC 模式, 按属性升序排列(属性值越小的越是排在前面) //SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按相关度降序 //SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排列。 //SPH_SORT_EXPR 模式,按某个算术表达式排序。 sphinxClient.setSortMode(SphinxClient.SPH_SORT_ATTR_DESC, "group_id"); //分页查询的范围 sphinxClient.setLimits(sqlStart, sqlCount); //查询 SphinxResult sphinxResult = sphinxClient.query(keyword); List<Long> idList = new ArrayList<Long>(); //检索后匹配到的内容 for ( SphinxMatch m : sphinxResult.getMatches() ) { //得到所到记录Id logger.debug(" found in sphinx:" + m.getDocId()); idList.add(m.getDocId()); }
经过测试:最后还是使用2.06版本测试通过(可以在我下载的页面中找到历史版本下载,2.06中有search.ex和searched.exe两个程序)。我之前下的2.2.9(只有searched.exe)无法搜索匹配到相应的表数据(能够索引成功,搜索服务也能启动)
只使用sphinx使用并不能达到很好的效果:
关键字 匹配结果
2015 test 进行搜索,不能成功匹配
2015 匹配
test 匹配
2015 t 没匹配
需要找办法解决和优化。