Mur*_*tza 5 ruby ruby-on-rails
我希望获得所有主题名称与搜索关键字匹配的个人资料.现在我正在加载所有配置文件.我需要知道如何实现它.任何帮助深表感谢.
Profile.rb
has_many :categorizations
has_many :subjects, through: :categorizations
Run Code Online (Sandbox Code Playgroud)
subject.rb中
has_many :categorizations
has_many :profiles, through: :categorizations
Run Code Online (Sandbox Code Playgroud)
Categorization.rb
belongs_to :profile
belongs_to :subject
Run Code Online (Sandbox Code Playgroud)
意见/搜索/ index.html.erb
# search form
<%= form_tag search_index_path, :method => 'get' do %>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "search", :name => nil %>
<% end %>
# search results
<% @profiles.each do |profile| %>
<%= profile.name %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
search_controller.rb
def index
@profiles = Profile.with_translations('en').all
end
Run Code Online (Sandbox Code Playgroud)
需要补充的是full text searchingRails 的想法。如果您正在执行搜索,则需要注意您实际上是在数据库中执行全文“搜索”查询,这根据您使用的 SQL 引擎而有所不同
MYSQL 全文搜索
该LIKE %{search}%机制是 MYSQL 非常基本的全文搜索功能,基本上是在数据库的整个记录中查找目标查询。这意味着如果您的查询是这样的:
SELECT * FROM `products` WHERE `name` LIKE '%alligator%'
Run Code Online (Sandbox Code Playgroud)
MYSQL 基本上会检查整个“名称”记录以查找对您的查询的任何引用。结果将取决于您的记录的任何部分是否包含“鳄鱼”一词。该参考文献对此进行了更多解释
PostgreSQL 全文搜索
我写这篇文章的原因是因为 PSQL 实际上以不同的方式执行此操作,因此您提供的查询仅适用于 MYSQL。PSQL 有很多不同的函数来处理全文搜索,但由于我们使用 Heroku,我们设法使用Textaulous gem使其全部正常工作
以下是PSQL 处理全文搜索的一些方法:
PostgreSQL 中的全文搜索基于匹配运算符 @@,如果 tsvector(文档)与 tsquery(查询)匹配,则返回 true。首先写入哪种数据类型并不重要:
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat &
rat'::tsquery; ?column?
---------- t
SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat
rat'::tsvector; ?column?
---------- f
Run Code Online (Sandbox Code Playgroud)
正如上面的示例所示,tsquery 不仅仅是原始文本,就像 tsvector > 一样。tsquery 包含搜索项,这些搜索项必须是已经规范化的词位,并且可以使用 AND、OR 和 NOT 运算符组合多个项。(有关详细信息,请参阅第 8.11 节。)to_tsquery 和 plainto_tsquery 函数有助于将用户编写的文本转换为正确的 tsquery,例如通过规范化文本中出现的单词。类似地,to_tsvector 用于解析和规范化文档字符串。因此,在实践中,文本搜索匹配看起来更像是这样:
SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat'); ?column?
---------- t Observe that this match would not succeed if written as
Run Code Online (Sandbox Code Playgroud)
SELECT '肥猫吃了肥老鼠'::tsvector @@ to_tsquery('fat &rat'); ?柱子? - - - - - F
全文检索软件
全文搜索在数据库上本质上是相当昂贵的,特别是当您有大量数据需要搜索时。这就是为什么存在像sunspot solr或sphinx这样的解决方案——提供一种索引和搜索您拥有的数据的方法
如果您的应用程序变得非常流行,您可能希望投资一种全文搜索系统,例如Heroku 演示的这些系统:

| 归档时间: |
|
| 查看次数: |
3638 次 |
| 最近记录: |