3

我已将以下内容添加到我的 gemfile 中:

gem 'texticle', "2.0", :require => 'texticle/rails' # search gem

然后我运行bundle install并捆绑安装了 gem

我正在使用 Rails 3.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 的原因是为了模糊搜索。

我是否缺少任何其他配置?

谢谢

4

2 回答 2

1

我建议检查几件事:

  1. 验证是否已为所涉及的每个数据库手动创建了扩展。我对'texticle:install_trigram'没有运气。如果您使用 Heroku,则可能需要执行其他步骤,尤其是在您尚未从共享数据库迁移的情况下。

  2. 使用模糊搜索方法。在最新版本的Texticle中,实际上有3个新方法;原始的#search 方法已被弃用。

要手动安装扩展:

本地开发/测试
psql -U &lt;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 Trigrams(模糊搜索)

安装 PostgreSQL Trigram

新的Texticle搜索方法(源代码)

于 2012-09-14T13:58:45.477 回答
0

我对 Texticle 工作方式的理解是,它将在您的字符串列上进行全文搜索,但默认情况下不一定进行模糊搜索。如果您查看它在 Postgres 中生成的查询,它正在寻找匹配“e”而不是任何包含字母“e”的单词。

您可以在此处阅读 Postgres 文档:

http://www.postgresql.org/docs/9.1/static/datatype-textsearch.html

也就是说,我在文档中看到了对前缀匹配但不支持后缀的支持,尽管我可能会遗漏一些东西。

如果您执行 Hotel.search('Marr:*') 会发生什么?

于 2012-08-19T15:27:32.263 回答