使用全文搜索查询绑定表?
Binding tables with fulltext search query?
我运行遇到了问题。我有三个 tables: product,其中存储了他的价格和名称。然后 table 查询带有属性的查询,例如搜索词的描述及其频率(因此没有重复项)。以及tableUsersQuery,存储用户的每一个搜索词。
PRODUCT
id
price
name
QUERY
id
description_query
number_of_freq
USERSQUERY
id
query_id FK
user_id FK
timestamp
我必须计算给定年份和随后年份(2018 年 1 月,2018 年 2 月,...)的每个月,计算包含产品名称的搜索查询与不包含产品名称的搜索查询之间的比率。如果给定月份没有定义给定比率,则输出应为 NULL。
你们知道这怎么可能吗?
到目前为止我只有这个
select q.description_query,
to_char(uq.timestamp, 'YYYY-MM') as year_month
from usersquery as uq
join query as q ON q.id = uq.query_id;
但我真的不知道如何绑定 table 与产品,只是用他的属性名称。我应该使用 tsvector 进行某种全文搜索吗?
-- table 不区分大小写,因此使用 product,query, user_query。请参考手册4.1词法结构。
demo
希望我理解正确。 number_of_freq是指查询包含产品名称的时候。如果 number_of_freqtext = 0 表示此查询不包含 product 关键字。
基本上是一个 generate_series 来生成日期系列数据(稍后用于左或右连接),计数过滤函数来计算频率为 0.
最终代码:
WITH cte AS (
SELECT
to_char(querytimestamp, 'YYYY-MM') AS tochar1,
count(number_of_freq) AS count_all,
count(number_of_freq) FILTER (WHERE number_of_freq = 0) AS count_0
FROM
query
JOIN user_query uq ON query.query_id = uq.query_id
WHERE
querytimestamp >= '2021-01-01 00:00' at time zone 'UTC'
AND querytimestamp <= '2022-12-31 23:59' at time zone 'UTC'
GROUP BY
1
),
cte2 (
yearmonth
) AS (
SELECT
to_char(g, 'YYYY-MM')
FROM
generate_series('2021-01-01', '2022-12-31', interval '1 month') g
)
SELECT
yearmonth,
cte.*,
round(cte.count_0::numeric / count_all, 2)
FROM
cte
RIGHT JOIN cte2 ON cte.tochar1 = yearmonth;
关于统计词频。全文搜索无济于事。
由于全文搜索会将 'product.id' 解析为 'product.id'。
您可能需要正则表达式拆分字符串函数。
参考count frequency demo解决词频问题:
我运行遇到了问题。我有三个 tables: product,其中存储了他的价格和名称。然后 table 查询带有属性的查询,例如搜索词的描述及其频率(因此没有重复项)。以及tableUsersQuery,存储用户的每一个搜索词。
PRODUCT
id
price
name
QUERY
id
description_query
number_of_freq
USERSQUERY
id
query_id FK
user_id FK
timestamp
我必须计算给定年份和随后年份(2018 年 1 月,2018 年 2 月,...)的每个月,计算包含产品名称的搜索查询与不包含产品名称的搜索查询之间的比率。如果给定月份没有定义给定比率,则输出应为 NULL。
你们知道这怎么可能吗? 到目前为止我只有这个
select q.description_query,
to_char(uq.timestamp, 'YYYY-MM') as year_month
from usersquery as uq
join query as q ON q.id = uq.query_id;
但我真的不知道如何绑定 table 与产品,只是用他的属性名称。我应该使用 tsvector 进行某种全文搜索吗?
-- table 不区分大小写,因此使用 product,query, user_query。请参考手册4.1词法结构。
demo
希望我理解正确。 number_of_freq是指查询包含产品名称的时候。如果 number_of_freqtext = 0 表示此查询不包含 product 关键字。 基本上是一个 generate_series 来生成日期系列数据(稍后用于左或右连接),计数过滤函数来计算频率为 0.
最终代码:
WITH cte AS (
SELECT
to_char(querytimestamp, 'YYYY-MM') AS tochar1,
count(number_of_freq) AS count_all,
count(number_of_freq) FILTER (WHERE number_of_freq = 0) AS count_0
FROM
query
JOIN user_query uq ON query.query_id = uq.query_id
WHERE
querytimestamp >= '2021-01-01 00:00' at time zone 'UTC'
AND querytimestamp <= '2022-12-31 23:59' at time zone 'UTC'
GROUP BY
1
),
cte2 (
yearmonth
) AS (
SELECT
to_char(g, 'YYYY-MM')
FROM
generate_series('2021-01-01', '2022-12-31', interval '1 month') g
)
SELECT
yearmonth,
cte.*,
round(cte.count_0::numeric / count_all, 2)
FROM
cte
RIGHT JOIN cte2 ON cte.tochar1 = yearmonth;
关于统计词频。全文搜索无济于事。 由于全文搜索会将 'product.id' 解析为 'product.id'。 您可能需要正则表达式拆分字符串函数。
参考count frequency demo解决词频问题: