rails3
1.下载coreseek-4.1-beta.tar.gz,可以在linux上运行下面命令下下载:
wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-4.1-beta.tar.gz
2. 进行解压
tar xzvf coreseek-4.1-beta.tar.gz
安装时要注意:是否为root权限,有些东西是要root权限才能安装上
3.进入coreseek-4.1-beta目录下
cd mmseg-3.2.14 ./bootstrap #输出的warning信息可以忽略,如果出现error则需要解决 ./configure --prefix=/usr/local/mmseg make && make install #可以去/usr/local 下查看一下是否存在mmseg文件夹,如果没有文件夹,请重新运行一遍上面代码。
4.注意mmseg文件夹所在的目录与下面代码对应
cd csft-3.2.14 或者 cd csft-4.0.1 或者 cd csft-4.1 sh buildconf.sh #输出的warning信息可以忽略,如果出现error则需要解决 ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/ --with-mysql make && make install
5.sphinx.yml配置
development: &my_settings enable_star: 1 min_prefix_len: 0 min_infix_len: 2 min_word_len: 1 max_results: 70000 morphology: none listen: localhost:3312 exceptions: RAILS_ROOT/log/sphinx_exception.log #项目目录下log文件夹中新建一个sphinx_exception.log文件,这个路径也修改为对应路径 chinese_dictionary: /usr/local/mmseg/etc/ #中文字典路径 bin_path: /usr/local/coreseek/bin test: <<: *my_settings production: <<: *my_settings
6.如果是运行开发
rake ts:config 生成一个development.sphinx.conf 生产:RAILS_ENV=production rake ts:config 生成一个production.sphinx.conf
注意: 把 listen = localhost:3312 修改为 listen = 127.0.0.1:9312 并且所有 charset_type = utf-8 修改为 charset_type = zh_cn.utf-8 并且所有 charset_type = zh_cn.utf-8 下添加 charset_dictpath = /usr/local/mmseg/etc/
7.再做索引
rake ts:index INDEX_ONLY=true 生产:RAILS_ENV=production ts:index INDEX_ONLY=true
8.thinkingsphinx用法:
实时索引 最常用的就是实时索引,它要求我们在被索引的模型中增加一个属性,名为delta。 ruby script/generate migration AddDeltaToTopic delta:boolean class AddDeltaToTopic < ActiveRecord::Migration def self.up add_column :topics, :delta,:boolean, :default => true, :null => false add_column :posts, :delta,:boolean, :default => true, :null => false end def self.down remove_column :topics, :delta remove_column :posts, :delta end end define_index do indexes :title,:sortable => true indexes first_post.body,:as => :body,:sortable => true indexes author has :created_at,:updated_at,:forum_id,:digest #声明使用实时索引 set_property :delta => true end define_index do indexes topic(:title),:as => :title ,:sortable => true indexes body,:sortable => true indexes author has :created_at,:updated_at,:forum_id #声明使用实时索引 set_property :delta => true end 定时索引 set_property :delta => :datetime, :threshold => 1.hour 一小时索引一次,实际上是重建所有索引,所以注意间隔时间不要短于建立索引的时间。 默认使用updated_at,这样就不用给被索引模型添加delta属性了。 需要结合的重建索引的命令为rake thinking_sphinx:index:delta或rake ts:in:delta 延时索引 set_property :delta => :delayed
9.搜索参数与配置方式
多模型查询 ThinkingSphinx::Search.search "term", :classes => [Post, User, Photo, Event] 指定匹配模式 SPH_MATCH_ALL模式,匹配所有查询词(默认模式)。 Topic.search "Ruby Louvre",:match_mode => :all Topic.search "Louvre" PH_MATCH_ANY模式,匹配查询词中的任意一个。 Topic.search "Ruby Louvre", :match_mode => :any SPH_MATCH_PHRASE模式,将整个查询看作一个词组,要求按顺序完整匹配。 Topic.search "Ruby Louvre", :match_mode => :phrase SPH_MATCH_BOOLEAN模式,将查询看作一个布尔表达式。 Topic.search "Ruby | Louvre, :match_mode => :boolean SPH_MATCH_EXTENDED模式,将查询看作一个Sphinx内部查询语言的表达式。 User.search "@name pat | @username pat", :match_mode => :extended 加权 为了提高搜索质量,我们可以对某些模型或字段进行加权,提高它们的优先度。默认都是1 User.search "pat allan", :field_weights => { :alias => 4, :aka => 2 } ThinkingSphinx::Search.search "pat", :index_weights => { User => 10 }
10.怎么指定model所对应的表,以及model索引写法
#encoding: utf-8 class Product < ActiveRecord::Base set_table_name "product" #设定model所对应的表,可以是复数或单数 define_index do indexes :name, :sortable=>true ##索引的字段,如果其他字段也要索引,就重新写一句 indexes product_type.Title, :as => :product_type_title #表关联索引 indexes :StartCity, :sortable=>true has :Sort, :ShowStatus #搜索时有条件,必须要添加到has里 has pinstances.comment_num, :as => :pinstance_comment_nums,:type=>:integer has pinstances.mall.grade,:as => :mall_grade,:type=>:integer #has :updated_at set_property :delta => true ##代码实时索引,并且表中要有delta字段 #set_property :delta => :datetime, :threshold => 1.hour end end
11.搜索里的参数
Product.search key, :page => page, :per_page => per_page, :order => order, :with => search_params, :star => true, :match_mode => :extended2, :field_weights => { :brand_name => 4,:brand_synonym => 3, :code => 4, :full_names =>2}, :sort_mode => :extended