我正在尝试在我的Rails应用程序中实现pg_search
并想知道是否有办法获得与搜索查询匹配的列?索引表内容包含所有可搜索的列字段。
E.g:
+-----------+----------+
| Firstname | Lastname |
+-----------+----------+
| John | Doe |
| Jane | Doe |
+-----------+----------+
将导致:
+----------+
| Content |
+----------+
| John Doe |
| Jane Doe |
+----------+
现在我不知道我的搜索查询是否与名字或姓氏相匹配。是否有任何选项可以告诉pg_search
将列标题添加到内容列中?类似的东西:
+------------------------------------------+
| Content |
+------------------------------------------+
| {"firstname": "John", "Lastname": "Doe"} |
| {"firstname": "Jane", "Lastname": "Doe"} |
+------------------------------------------+
或者是否有符合我需求的搜索方案? pg_search
效果非常好,特别是因为我的多租户/ postgres架构架构。
答案 0 :(得分:0)
嵌套解决方案可能是为每列匹配的行动态生成tsvectors +查询..
示例:
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');
所以,我们刚刚做的是给名字栏a#34;重量" " A"和"姓氏"栏a"重量" " B"在tsvector。请记住," A"," B"," C"和" D"是唯一有效的权重,因此如果您需要使用超过4列的权重,它将无法工作。
您的查询可以根据需要查询特定权重,并且权重在tsvector的文本表示中可见,但是在搜索时它们不可用(IE,返回找到搜索项的权重)