`
tim.teng
  • 浏览: 9959 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
阅读更多
为什么选择ferret的原因咱就不说了,废话少说

下载ferret.gem , acts_as_ferret plugin
gem : gem insatall ferret
plugin : svn://projects.jkraemer.net/acts_as_ferret/trunk/plugin/acts_as_ferret,直接check out下来放到vendor/plugin 目录下即可
现有一个model:

class Provider< ActiveRecord::Base
....... ...................
acts_as_ferret :fields => [:name,:description,:address,:website,:score,:phone,:direction]
.......... ............
end

这里:fields就是要进行索引的对象属性了,当然你也可以不指定,直接就一句"acts_as_ferret",默认不指定的时候是对所有列进行索引,先时事效果:
>>ruby script/console
>>Provider.find_by_contents(" 你要 搜索 的内容")
OK,如果没有意外的话, 结果会返回一个ActsAsFerret::SearchResults对象。如果出错了,回过去检查一下,短短几步,检查起来也应该很方便。
几个tip:
# "关键词1" AND “关键词2”
Provider.find_by_contents(" 关键词1 关键词2")
#"关键词1" OR "关键词2"
Provider.find_by_contents("关键词1 OR 关键词2")
#貌似“关键词1”的结果
Provider.find_by_contents("关键词1~")
上面这几个都是小儿科啦

下面我们到acts_as_ferret plugin内部去看看,
acts_as_ferret/lib 瞄到 acts_as_ferret.rb 第116行(VERSION=181)
“ActiveRecord::Base.extend ActsAsFerret::ActMethods”
许多blog中都建议在要进行分词查询的model中加入下面一段代码:

def full_text_search(q, options = {})
return nil if q.nil? or q.strip.blank?
default_options = {:limit => 10, :page => 1}
options = default_options.merge options
options[:offset] = options[:limit] * (options.delete(:page).to_i-1)
results = self.find_by_contents(q, options)
[results.total_hits, results]
end
不过,本着DRY的原则,我决定从ActiveRecord::Base.extend ActsAsFerret::ActMethods”这句话上做文章,既然ActiveRecord::Base 继承了 ActsAsFerret::ActMethods ,何不将这段代码加入到ActMethods里去,让所有model都拥有 full_text_search的功能?

module ActsAsFerret #:nodoc:

# This module defines the acts_as_ferret method and is included into
# ActiveRecord::Base
module ActMethods

def full_text_search(q, options = {})
return nil if q.nil? or q.strip.blank?
default_options = {:limit => 10, :page => 1}
options = default_options.merge options
options[:offset] = options[:limit] * (options.delete(:page).to_i-1)
results = self.find_by_contents(q, options)
[results.total_hits, results]
end

................ ....................

end
end
重启一下,Provider.full_text_search方法应该出来了,有问题的话自己回去检查看看
下面就是俗套,在application.rb中加入:
def pages_for(size, options = {})
default_options = {:per_page => 10}
options = default_options.merge options
pages = Paginator.new self, size, options[:per_page], (params[:page]||1)
pages
end
这些种种工作都是为了在controller以及view中调用:
controller:
def search @query=params[:query]
@total, @providers = Provider.full_text_search(@query, :page => (params[:page]||1))
@pages = pages_for(@total)
end

view:
<%= pagination_links(@pages, :params => {:query=>@query}) %>

关于 find_by_contents(q, options = {}, find_options = {})
中的find_options,考虑一下一种情况:
provider表结构:
id name description category_id

如果要对特定category_id的数据进行检索,应如何?这里就用到了find_option了:
代码:
Vendor.find_by_contents(" 要进行检索的关键字 ",{:limit=>30},{:joins=>"providers join categories on providers.category_id = categories.id ", :conditions =>" providers.category_id = XXXXX "})
其他一些小技巧大家可以到到网上找找,这里就不一一列举了。

=========================================================================================


acts_as_ferret :fields => {
:name => {},
:address => {},
:website => {},
:score => {:index=> :untokenized, :term_vector => :no ,:boost=>10},
:vote_count => {:index=> :untokenized, :term_vector => :no,:boost=>5},
:category_name=>{},
:tag_name=>{},
:taste => {:index => :untokenized},
:service => {:index => :untokenized},
:environment => {:index => :untokenized},
:deal => {:index => :untokenized},
}
分享到:
评论
1 楼 dohiker 2007-06-15  
好帖,顶

相关推荐

    acts_as_list.rar

    acts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_...

    acts_as_authenticated

    "acts_as_authenticated" 是一个经典的Ruby on Rails插件,它为Rails应用提供了用户认证功能。在Rails框架中,用户认证通常涉及验证用户身份、管理会话以及处理登录和登出等操作。acts_as_authenticated插件简化了这...

    acts_as_list, 用于管理列表的ActiveRecord插件.zip

    acts_as_list, 用于管理列表的ActiveRecord插件 ActsAsList描述这个 acts_as 扩展提供了对列表中的多个对象进行排序和重新排序的功能。 具有指定的类的类需要在映射的数据库表上定义为整数的position 列。 0.8.0升级...

    acts_as_paranoid

    "acts_as_paranoid" 是一个在Ruby on Rails框架中常用的gem,用于处理数据库记录的软删除(soft delete)。在数据库操作中,通常我们会遇到删除数据的需求,但直接删除可能会导致数据丢失,尤其是在生产环境中。...

    用acts_as_rateable实现简单的打分功能

    在Ruby on Rails框架中,`acts_as_rateable`是一个非常实用的插件,它允许用户对模型进行评分,从而实现简单的打分功能。这个插件是Rails社区中的一个开源项目,旨在简化应用中的评分系统集成。在本篇讨论中,我们将...

    acts_as_category:想想acts_as_tree +权限

    #ActsAsCategory acts_as_category (Version 2.0 beta)acts_as_category,是acts_as插件在acts_as_tree风格的Ruby on Rails的ActiveRecord的模式,但有一些额外的功能,以及多种便捷视图助手。例子(有关实例方法和...

    acts_as_nested_set的增强版BetterNestedSet

    《深入理解BetterNestedSet:acts_as_nested_set的增强版》 在Ruby on Rails开发中,数据结构的选择对于数据库操作的效率至关重要。其中,Nested Set模型是一种常用的数据组织方式,尤其适用于管理具有层级关系的...

    rails_admin_acts_as_list:rails_admin插件以对记录进行排序

    介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...

    acts_as_restful_list:就像acts_as_list一样,但很安静

    acts_as_restful_list 就像acts_as_list 一样,但不必使用非标准方法调用(如insert_at)来弄乱您的代码,acts_as_restful_list 使管理列表变得简单。 您可以像更新其他任何内容一样更新 position 属性,其余的都...

    active_record-acts_as, 模拟activerecord模型的多表继承.zip

    active_record-acts_as, 模拟activerecord模型的多表继承 插件开发已经移动这个项目的积极发展已经转移到了的krautcomputing fork 。 请在那里报告问题并打开 PRs ! ActiveRecord::ActsAs这是对 acts_as_relation的...

    acts_as_paranoid:ActiveRecord插件可让您隐藏和还原记录,而无需实际删除它们

    支持该分支仅针对Rails 5.2+和Ruby 2.4+ 如果您使用的是Rails 5.1或更早的版本,或者Ruby 2.3或更早的版本,请切换到相应的分支,或者需要一个更旧版本的acts_as_paranoid gem。已知的问题在同一模型上使用acts_as_...

    Api-acts_as_api.zip

    Api-acts_as_api.zip,使在rails中创建api响应变得简单和有趣,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api简化了编程...

    acts_as_liked:向任何 Active Record 模型添加类似功能

    gem 'acts_as_liked' 然后执行: $ bundle 运行生成器: $ rails generate acts_as_liked 并且不要忘记迁移您的数据库 $ rake db:migrate 用法 可爱的模特 将acts_as_likeable添加到任何模型,它的实例可以被...

    acts_as_commentable_with_threading:类似于acts_as_commentable; 然而,利用 awesome_nested_set 提供线程评论

    与acts_as_commentable 兼容(但需要更改数据库架构) 要求 此 gem 的 2.x 版本仅适用于 Rails 4 及更高版本。 对于此 gem 的 Rails 3.x 兼容版本,请使用版本 1.2.0。 这个宝石取决于 CollectiveIdea 的 Awesome ...

    actions_as_commentable:ActiveRecord acts_as_commentable插件

    gem 'acts_as_commentable' Rails gem 'acts_as_commentable' , '3.0.1' Rails gem 'acts_as_commentable' , git: 'git@github.com:jackdempsey/acts_as_commentable.git' , branch: '2.x' 生成器 Rails 3+ ...

    acts_as_aliased:扩展 ActiveRecord

    gem 'acts_as_aliased' 更新包后,运行 rails generate acts_as_aliased:install rake db:migrate 这将创建一个新表aliases 。 用法 假设您有一个需要别名的模型Company ,因为公司名称有不同的版本。 使用acts_as...

    acts_as_xapian:Xapian全文搜索插件,适用于Ruby on Rails

    《acts_as_xapian:为Ruby on Rails打造的Xapian全文搜索引擎插件》 在Web开发领域,全文搜索引擎能够极大地提升用户对信息的检索效率,对于内容丰富的应用尤其重要。Ruby on Rails作为流行的Web框架,有着众多的...

    acts_as_shopping_cart:简单的购物车实施

    acts_as_shopping_cart 一个简单的购物车实现。 您可以找到示例应用程序。 安装 滑轨3 从0.2.0版开始,不再支持Rails 3。 如果您仍需要在Rails 3应用程序中实现此gem,请使用0-1-x分支 将其包含在您的Gemfile中 ...

    acts_as_snapchat:使您的 Active Record 模型表现得像 Snapchat 上的内容

    为了使任何模型充当snapchat,只包括acts_as_snapchat在类定义: class User &lt; ActiveRecord xss=removed&gt; 1 sleep 10 User . count # =&gt; 0 如果您是 Node.js 开发人员,您可能更喜欢使用别名acts_as_mongodb 。 ...

    acts_as_reference_data

    文档基本用法例如, SubscriptionType是一个 ActiveRecord: require 'acts_as_reference_data'class SubscriptionType &lt; ActiveRecord::Base acts_as_reference_dataend假设已创建迁移以使用各种类型填充此表,...

Global site tag (gtag.js) - Google Analytics