Sphinx 在 windows 上的安装并用JAVA调用

来源:互联网 发布:linux vi 不保存 编辑:程序博客网 时间:2024/06/04 20:51


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是需要修改的
  

简单分词,只支持,如果要搜索中文,请指定为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() ) {//得到所到记录Idlogger.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             没匹配

需要找办法解决和优化。


0 1
原创粉丝点击