postgresql - PostgreSQL:将一组关键字(任何)与多语言文本匹配
问题描述
在 Postgre 12.0 中,我需要检查包含文本的特定列(可以是多种语言,没有可靠的指示文本实际使用的语言)是否包含任何一组关键字。关键字可以是单个词或特定短语。(但是,大小写匹配是不可取的)
如果有匹配,我想返回相应的行。
我有一个表格,其中包含文档的数字标识符(id1)、文档部分的数字标识符(id2)和一个包含 HTML 文本(内容)的 varchar 列
关键字存储在单独的表关键字中,简单地作为 id 和 varchar(包含关键字/“搜索词”)
我想我应该使用包含 to_tsvector() 的查询
SELECT
mt.*
FROM
mytable mt
WHERE
to_tsvector('simple', mt.contents) @@
to_tsquery('simple', kw.keyword);
如您所见,这不会运行,因为我需要获取该匹配项的关键字列表。
我唯一的想法是首先通过连接关键字表中的所有关键字然后使用它来构造一个用于匹配的字符串,如
SELECT
mt.*
FROM
mytable mt
WHERE
to_tsvector('simple', mt.contents) @@
to_tsquery('simple', 'kw1 | kw2 | kw3 ... | kwN');
但是为此,我仍在为如何解析而苦苦挣扎,我唯一想到的是这样的:
SELECT
mt.*
FROM
mytable mt
WHERE
to_tsvector('simple', mt.contents) @@
to_tsquery('simple', (SELECT
string_agg(keyword, ' | ') AS keyword
FROM keywords) );
你能帮我吗?
解决方案
您可以使用短语搜索功能。因此,对于您评论中的示例,您需要使用 tsquery kw1 | specific <-> words
。您可以将已经存在的多词短语存储在表中<->
,或者使用 regexp_replace 将空格转换为<->
SELECT
mt.*
FROM
mytable mt
WHERE
to_tsvector('simple', mt.contents) @@
to_tsquery('simple', (SELECT
string_agg(regexp_replace(keyword,' ',' <-> ','g'), ' | ') AS keyword
FROM keywords) );
如果你有连字符的单词或短语,那就搞砸了。
推荐阅读
- javascript - MOGRT 中的 Premiere Pro Extendscript 复选框选择
- c# - 如何将元素插入数组C#
- core-data - 如何在共享容器中加载新的 Core Data 文件?
- bash - Grep 返回 'grep: node_list.txt: No such file or directory' 错误
- clojure - 如何在 Clojure 中嵌套 require?
- scala - 如何使用 BehaviorTestKit 来验证是否生成了正确的孩子
- haskell - GHCI - 提示颜色在 Windows 上不起作用
- c - C编程将char数组复制到char的二维数组
- javascript - 为什么删除元素后所需的检查不起作用?
- python - 无法使用 DolphinDB Python API 上传包含混合类型数据的 DataFrame