在 postgresql 中搜索文本时寻找简单的 contains 方法

cod*_*ann 11 postgresql embedded full-text-search python

我是 PostgreSQL 世界的新手,所以我提前道歉,因为不知道这些问题是否有明显的答案。

基本上我在寻找两件事。首先是一个简单的基于“包含”的搜索,其中 python 等效项类似于:

def find_all_containing( input_array=[], target ):
    output=[]
    for i in input_array:
        if target in i:
            output.append(i)
    return(output) 
Run Code Online (Sandbox Code Playgroud)

在我目前正在构建的数据库中,从逻辑上讲,如果我试图显示描述中包含“evil”的所有片段标题,我倾向于相信 SQL 命令看起来有点像这样。

SELECT title FROM snippets WHERE 'evil' in description;
/* or */
SELECT title FROM snippets WHERE description CONTAINS 'evil';
Run Code Online (Sandbox Code Playgroud)

我编写了一个内联 python 函数,它返回一个 'TRUE' 或 'FALSE' 来完成以下工作。

/* contains function here */
CREATE FUNCTION contains (input_text text, target text) RETURNS text AS $$
if target in input_text:
  return("TRUE")
return("FALSE")
$$ LANGUAGE plpythonu;

/* working command of the script */
SELECT title FROM snippets WHERE contains(description,'Evil')='TRUE';
Run Code Online (Sandbox Code Playgroud)

这有效并且应该阻止我问,但我真的更喜欢学习 SQL 世界将如何解决这个问题,因为学习 SQL 的重点是学习如何使用数据库,而不是仅仅找到另一种方法来塑造 python 以重新创建一个nosql的感觉。

第二件事是,这不是我第一次将一些 Python 片段放在一起,为数据库带来更多的 Python 思维。对于那些深入了解 SQL 世界的人来说,我这样做是不是错过了什么?我得到它的速度,但如果速度是一个问题,我会假设我只需要用 C 重写实现。

保持它尽可能简单到目前为止已经很好地工作了,这就像现在一样。但是,当我发现自己在几乎所有解决方案的代码中都嵌入了另一种语言时,我就会开始问自己是否缺少更大的图景。

Cra*_*ger 13

有两种典型的表达方式。

使用中LIKE缀搜索:

SELECT title FROM snippets WHERE description LIKE '%evil%';
Run Code Online (Sandbox Code Playgroud)

或与position

SELECT title FROM snippets WHERE position('evil' in description) > 0;
Run Code Online (Sandbox Code Playgroud)

请注意,默认情况下两者都不可索引。搜索“中缀搜索索引”以获取更多信息,并查看pg_trgm您是否需要它。