ruby-on-rails - 如何获取与搜索查询匹配的列?

标签 ruby-on-rails postgresql pg-search

我正在尝试在我的 Rails 应用程序中实现 pg_search,想知道是否有办法获取与搜索查询匹配的列?索引表内容由所有可搜索的列字段组成。

例如:

+-----------+----------+
| Firstname | Lastname |
+-----------+----------+
| John      | Doe      |
| Jane      | Doe      |
+-----------+----------+

将导致:

+----------+
| Content  |
+----------+
| John Doe |
| Jane Doe |
+----------+

现在我不知道我的搜索查询是否匹配名字或姓氏。是否有任何选项可以告诉 pg_search 也将列标题添加到内容列?像这样的东西:

+------------------------------------------+
|                 Content                  |
+------------------------------------------+
| {"firstname": "John", "Lastname": "Doe"} |
| {"firstname": "Jane", "Lastname": "Doe"} |
+------------------------------------------+

或者是否有适合我需要的搜索替代方案? pg_search 工作得很好,特别是因为我的 Multi-Tenancy /postgres-schema 架构。

最佳答案

嵌套解决方案可能是为匹配行的每一列动态生成 tsvectors+query..

例子:

select *,
(to_tsvector(p.first_name)@@ to_tsquery( 'joe:*' )) found_in_first_name,
(to_tsvector(p.last_name)@@ to_tsquery( 'joe:*' )) found_in_last_name
from people p 
where  p.fts @@ to_tsquery( 'joe:*' );

此示例可能是最佳解决方案,具体取决于您希望在每个结果集中返回多少数据

另一种方法是破解“权重”以获得您想要的:

UPDATE people SET fts =
    setweight(to_tsvector(coalesce(firstname,'')), 'A')    ||
    setweight(to_tsvector(coalesce(lastname,'')), 'B');

因此,我们刚刚所做的是在 tsvector 中为名字列赋予“A”的“权重”,为“姓氏”列赋予“B”的“权重”。请记住,“A”、“B”、“C”和“D”是唯一有效的权重,因此如果您需要对超过 4 列执行此操作,它将不起作用。

如果需要,您的查询可以查询特定的权重,并且权重在 tsvector 的文本表示中可见,但是在搜索时它们不可用(IE,返回找到搜索词的权重)

关于ruby-on-rails - 如何获取与搜索查询匹配的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27836332/

相关文章:

ruby-on-rails-3 - 我应该把 PgSearch.multisearch_options 放在哪里?

ruby-on-rails - 在 pg_search 查询后列出可搜索值

mysql - Rails 错误使字段变得唯一

php - 在 Postgres 数据库上从 PHP (Kohana) 运行批处理 SQL 脚本的首选方式是什么

sql - 如何使用 SQL (postgresql) 查询有条件地更改每个组内的值?

sql - 将带有十六进制的文本字符串作为 bytea 插入 PostgreSQL

ruby-on-rails - 使用 pg_search gem for substring 在 rails 上进行 PG 全文搜索

ruby-on-rails - 如何将参数传递给 LEFT JOIN?

ruby-on-rails - Action 缓存未正确过期,即使我可以看到它正在被调用

mysql - 在新 Controller 方法中使用 form_for 时未定义方法