全文搜索多对多关系

时间:2018-11-29 18:15:36

标签: sql postgresql

我有下表

enter image description here

关键字表

CREATE TABLE trigger_keyword
(
    id bigint NOT NULL,
    keyword text NOT NULL,
    CONSTRAINT trigger_keyword_id PRIMARY KEY (id)
)

这是桥表

CREATE TABLE trigger_keyword_trigger_message
(
    trigger_keyword_id bigint NOT NULL,
    trigger_message_id bigint NOT NULL,
    CONSTRAINT trigger_keyword_trigger_message_trigger_keyword_id_fkey FOREIGN KEY (trigger_keyword_id)
        REFERENCES public.trigger_keyword (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE NO ACTION,
    CONSTRAINT trigger_keyword_trigger_message_trigger_message_id_fkey FOREIGN KEY (trigger_message_id)
        REFERENCES public.trigger_message (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE NO ACTION
)

消息表

CREATE TABLE trigger_message
(
    id bigint NOT NULL,
    message text NOT NULL,
    CONSTRAINT trigger_message_id PRIMARY KEY (id)
)

我在PostgreSQL数据库之外有一个字符串列表,我将循环运行它。

假设我们在trigger_keyword表中有以下关键字

trigger_keyword表

id  keyword
----------------------------------------
1   hi
2   hello
3   the weather
4   the climate

trigger_message表

id  message
-----------------------------------------
1   Hi how is your day?
2   Hello, have a wonderful day
3   Looks sunny today
4   Excellent, no rain today
5   looks like we'll have showers today

假设我们的一个字符串是Hi Robot!,那么SQL查询应该返回Hi how is your day?Hello, have a wonderful day;它应该随机选择其中之一。如果字符串包含hello robot而不是hi robot,则应该执行相同的操作,因为hihello都在关键字表中。

如果字符串包含tell me the weather,则SQL查询应随机返回Looks sunny todayExcellent, no rain todaylooks like we'll have showers today

我认为我必须为此使用全文搜索?

这是我第一次使用桥表,是否需要在桥表中手动插入关系?

1 个答案:

答案 0 :(得分:2)

您应在包含两列的“ bridge”表上定义主键约束。

this answer中指示的全文本搜索是实现此目的的一种方法。

要随机选择一个结果行,可以将以下内容附加到查询中:

ORDER BY random() LIMIT 1

要插入表中,可以使用DEFAULT子句,并在id列的定义中使用序列,并使用INSERT ... RETURNING获取桥表的值。 / p>