Ruby 全文搜索 sunspot

towonzhou · 2014年11月06日 · 最后由 ken 回复于 2014年11月09日 · 4308 次阅读

搜索是每个 web 都需要的,通常有三种方法。

  1. 普通青年:sql 的 like 语句
  2. 文艺青年:用 NoSQL 或搜索引擎
  3. xx 青年 : 从数据库读出数据后,字符串匹配......

数量不大的时候 (十万一下),用 like 就可以了,当时当数量在百万级,搜索引擎就是最好的方法。

简要介绍 Solr 搜索引擎,更多介绍看这个

先介绍Lucene:  Lucene是基于JAVA的搜索引擎,能够实现对多字段的搜索,支持过滤器设置、分布式搜索、多样化搜索(多关键字,单/多字段匹配)、结果排序等。Lucen提供一组解读,过滤,分析文件,编排和使用索引的API,它的强大之处除了高效和简单外,是最重要的是使使用者可以随时应自已需要自订其功能。
Solr是基于Lucene二次开发的搜索引擎。扩展了很多特性:局部索引、任意对象索引、支持boolean、Facets等特性。在ROR中有相关gem包sunspot的支持。

在 rails 中安装 Sunspot 很简单,Gemfile 中添加 gem 即可

gem 'sunspot_rails'
gem 'sunspot_solr' # optional pre-packaged Solr distribution for use in development

然后就是bundle install了。

安装完成之后需要运行一下rails generate sunspot_rails:install, 会生成config/sunspot.yml文件,连接 solr 服务的配置文件,solr 服务默认端口是 8983 启动 solr rake sunspot:solr:start

ok 准备工作就搞定了

使用 Sunspot

  1. 我们先要配置一下你准备搜索的 model ``` class People < ActiveRecord::Base attr_accessible :age, :name, :dec

searchable do text :dec integer :id string :name end end

People有三个属性,dec是text的, 主要是searchable方法, text就表示需要全文索引的元素了,而像integer和string是用于scope的.

配置完毕之后,你可以在``rails c``中执行``People.reindex``就把People的内容索引进了solr服务. 你也可以直接``rake sunspot:reindex``

最后一步取出数据
有三个方法可以取出数据,看个人喜欢
1.

#找出 dec 字段中存在 ruby 的 people a = People.search { fulltext 'ruby' }

2.

#找出 dec 字段中存在 ruby 的 people a = Sunspot.search(People) { keywords '撒谎'}

3.

sun_spot = Sunspot.new_search(People) sun_spot.build {keywords '撒谎'} a = sun_spot.execute

输出``a.total``的结果是 ``=> 2``,表示有几条匹配的记录
`a.results`表示结果数组
`a.results.total_pages` 一共有多少页
`a.results.first_page?`  是否第一页

更多方法参见[Sunspot Github](https://github.com/sunspot/sunspot)

感谢分享

中文分词效果咋样?

#2 楼 @hupengxing solr 自带 ictclas 阉割版 smartcn,性能较渣。个人认为搜索效果和分词性能联系不大。其实就单纯文字 bigram 切割都足以应付日常使用。

使用 elasticsearch

gem 'chewy'
gem 'chewy_kiqqer'

各种分词器与 mapping 很爽的 tokenizer!!

匿名 #5 2014年11月06日

#4 楼 @kaka :plus1:

#4 楼 @kaka 这个 gem 没用过诶,也来个介绍文吧 -_-

@towonzhou 有时间是的分享一下

#7 楼 @kaka 最近经常听到 es 啊

es 很棒 但是比较费资源 据说 最近也在看

@fsword 现在国内很多公司在使用 elasticsearch

@kaka ,赶紧分享~~

就差一天就用上了,最后用了 ransack

需要 登录 后方可回复, 如果你还没有账号请 注册新账号