我在我的gemfile中添加了以下内容:
gem 'texticle', "2.0", :require => 'texticle/rails' # search gem
然后我运行bundle install
并捆绑安装了gem
我使用的是Rails3.1.0,我使用的也是Postgres数据库。
我验证我在数据库表中是否有我要查找的字符串:
ruby-1.9.2-p290 :004 > Hotel.first
Hotel Load (0.4ms) SELECT "hotels".* FROM "hotels" LIMIT 1
=> #<Hotel id: 1, title: "Marriot Hotel", created_at: "2012-03-01 23:53:16", updated_at: "2012-03-01 23:53:16">
当我运行`Hotel.search('e')时
ruby-1.9.2-p290 :005 > Hotel.search(:title => 'e')
Hotel Load (1.4ms) SELECT "hotels".*, ts_rank(to_tsvector("hotels"."title"), to_tsquery('e')) AS "rank0.4785527956789428" FROM "hotels" WHERE (to_tsvector('english', "title") @@ to_tsquery('e')) ORDER BY "rank0.4785527956789428" DESC
=> []
我一无所获。我试着运行Hotel.search('e')
,但仍然一无所获。如果我尝试Hotel.search(:title => 'Marriot')
,那么它是有效的,但我使用Texticle的原因是为了模糊搜索。
我是否缺少任何其他配置?
感谢
我建议检查以下几件事:
-
验证是否已为所涉及的每个数据库手动创建扩展。我在"texticle:install_trigram"上运气不佳。如果你使用的是Heroku,可能会有额外的步骤,尤其是如果你还没有从共享数据库迁移的话。
-
使用fuzzy_search方法。在Texticle的最新版本中,实际上有3种新方法;最初的#search方法已被弃用。
手动安装扩展:
本地开发/测试psql -U <username>
l
c db_development
CREATE EXTENSION pg_trgm;
dx
c db_test
CREATE EXTENSION pg_trgm;
dx
q
Heroku集成/生产heroku pg:psql
dx
CREATE EXTENSION pg_trgm;
dx
更多?
PostgreSQL三角图(模糊搜索)
- PostgreSQL 9.1的新增功能-PostgreSQL wiki
- trigram |汤博乐
安装PostgreSQL Trigram
- benhamill安装Trigram Rake任务·拉请求#63·温柔/texticle·GitHub
- texticle:install_trigram-在Heroku上?·第15期·温柔/texticle·GitHub
新的文本搜索方法(源代码)
- texticle/lib/texticle.rb在master·texticle/texticle·GitHub
我对Texticle工作方式的理解是,它将对字符串列进行全文搜索,但默认情况下不一定进行模糊搜索。如果你看看它在Postgres中生成的查询,它在寻找"e"上的匹配,而不是任何包含字母"e"的单词。
你可以在这里阅读Postgres文档:
http://www.postgresql.org/docs/9.1/static/datatype-textsearch.html
也就是说,我在文档中看到了对前缀匹配的支持,但不支持后缀,尽管我可能遗漏了一些内容。
如果你搜索酒店会发生什么?