Skip to content
saberma edited this page Nov 19, 2011 · 15 revisions

全文检索

Sphinx + ThinkingSphinx

采用 CoreSeek 扩展支持中文
为保证引擎的稳定性,选择以下版本

  1. CoreSeek 3.2.14,基于Sphinx0.9.9稳定版

安装过程查看这里 Linux下安装CoreSeek
Mac OS安装CoreSeek

rails连接Sphinx的客户端采用 Thinking-Sphinx

注意:
有些文章说要手动编译libmmseg ruby的扩展,其实是不需要编译的,不影响thinking-sphinx的使用
另外,此扩展不能在ruby1.9.2下编译(提示找不到STR2CSTR定义)

Ubuntu 10.04下安装CoreSeek:

sudo apt-get install m4 autoconf libtool g++
cd /tmp
wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz
tar xzvf coreseek-3.2.14.tar.gz
cd coreseek-3.2.14
cd mmseg-3.2.14
ACLOCAL_FLAGS="-I /usr/share/aclocal" ./bootstrap
./configure --prefix=/opt/coreseek/mmseg3
make
sudo make install
cd ../csft-3.2.14
sh buildconf.sh
./configure --prefix=/opt/coreseek  --without-unixodbc --with-mmseg --with-mmseg-includes=/opt/coreseek/mmseg3/include/mmseg/ --with-mmseg-libs=/opt/coreseek/mmseg3/lib/ --without-mysql --with-pgsql
make
sudo make install

启动

#rake ts:conf #生成sphinx配置
rake ts:in #建立索引(索引文件放在项目目录下的db/sphinx,并以环境名称为目录)
rake ts:start #启动后台sphinx服务

词典

词典采用使用的是默认词库,放在 lib/uni.lib
以后如果需要追加词汇,可以修改 lib/unigram.txt后,参考 LibMmseg中文分词 重新生成词典

定义索引

在rails定义索引参考 ts定义索引
每次修改索引定义要重新运行:

rake ts:conf #重新生成sphinx配置文件

查询

在rails全文查询参考 ts查询

shop.products.search 'iphone' #相当于Product.search, :with => {:shop_id => @shop.id}

跨实体查询

ThinkingSphinx.search('商品', :classes => [Product, Blog, Page], :with => {:shop_id => 3})

增量更新索引

实体属性值变化后,调用save方法会即时更将索引,此方案会造成请求时间过长
采用 ts-resque-delta 插件集成resque在后台增量更新

参考资源

LibMmseg中文分词

Solr + SunSpot

solr是使用Java语言编写的全文检索引擎,基于Lucence、提供http接口访问
部署方便,不像Sphinx绑定数据库查询,但需要独立运行java servlet服务器(tomcat,jetty等)
另一个好处是开发环境下不需要手动安装solr,sunspot自带嵌入式的solr服务器

中文支持可以使用 mmseg4j
为配合中文分词,所使用solr版本选用1.4.1,而不是最新的版本

solr web接口

查看solr是否正常启动,可以输入id:[* TO *]列表所有索引結果

http://lvh.me:8982/solr/admin

通过查看日志分类是否存在 com.chenlb.mmseg4j 来判断solr是否已经加载mmset4j分词插件

http://lvh.me:8982/solr/admin/logging

是否能够正常分词,选择Field为Type,值为textComplex;Field value输入:Ruby是一门编程语言,点击Analyze

http://lvh.me:8982/solr/admin/analysis.jsp

增量更新

sunspot会将新增、更新的记录发送至solr,但不会发送commit(只有运行reindex才会发送commit命令)
可以配置 solr/conf/solrconfig.xml ,启用 autoCommit 参数,设置更新的记录数或者时间(ms)

更新时如果 solr 服务出问题,则会导致rails操作不成功,所以要把更新操作放到resque后台执行

查询不出結果?

很有可能是没有修改 solrconfig.xml 的autoCommit参数,可按以下方式调试(绕开resque并加入commit指令)

session = Sunspot.session
Sunspot.session = Sunspot::Rails.build_session
product = Product.find(1)
Sunspot.index(product)
Sunspot.commit
Sunspot.search(Product) { keywords 'keyword' }.results
Sunspot.session = session

另外要留意区分英文关键字和中文关键字,如果只是中文无法查询,则可能是servlet container(tomcat)的编码设置不正确

solr压缩包中有测试utf-8编码是否正常的脚本

example/exampledocs/test_utf8.sh http://localhost:8982/solr/select
Solr server is up.
HTTP GET is accepting UTF-8
HTTP POST is accepting UTF-8
HTTP POST defaults to UTF-8
HTTP GET is accepting UTF-8 beyond the basic multilingual plane
HTTP POST is accepting UTF-8 beyond the basic multilingual plane
HTTP POST + URL params is accepting UTF-8 beyond the basic multilingual plane

如果显示ERROR,则表示编码有误,要确保 tomcat conf/server.xml的配置connector加入了 URIEncoding="UTF-8" useBodyEncodingForURI="true"

在centos下,测试了tomcat5.5.23,tomcat5,tomcat7,加入utf8配置后,仍然存在编码问题,更换为jetty。

参考资源

278: Search With Sunspot
Solr与mmseg4j部署
全文索引与Solr集成
solr 中文分词 mmseg4j 使用例子
Sunspot — Resque Session Proxy
http://wiki.apache.org/tomcat/FAQ/CharacterEncoding
http://www.tinhtruong.info/2011/08/setting-up-jetty-74x-on-centos-5x-as.html
http://wiki.apache.org/solr/SolrJetty
http://download.eclipse.org/jetty/stable-7/dist/
http://wiki.eclipse.org/Jetty/Feature/JNDI

Clone this wiki locally