标签: tsvector

更新tsvector更新触发器

我在表上允许我执行全文搜索的tsvector列'user_tsv'有以下tsvector更新触发器,

CREATE TRIGGER tsvector_user_update BEFORE INSERT OR UPDATE ON users
FOR EACH ROW EXECUTE PROCEDURE 
tsvector_update_trigger(user_tsv, 'pg_catalog.english', firstname, surname, email);
CREATE INDEX user_index_tsv ON users USING gin(user_tsv);
Run Code Online (Sandbox Code Playgroud)

我已经在表中添加了另一个列,我希望包含在此触发器中,是否有任何方法可以更新触发器(以及tsvector列)或者是否需要删除列/触发器并重新添加它们?

PostgreSQL 9.0

提前致谢

大卫

sql postgresql relational-database tsvector

4
推荐指数
1
解决办法
842
查看次数

使postgres全文搜索(tsvector)像ILIKE一样搜索单词内部?

所以我想说我会搜索'Blerg'.我有一个名为SomethingblergSomething的项目.

如果我在postgres(和rails)中进行ILIKE搜索,如下所示:

where("name ILIKE ?", "%#{ 'Blerg' }%")
Run Code Online (Sandbox Code Playgroud)

它将返回结果'SomethingBlergSomething',因为它包含Blerg.

有没有办法让更快的tsvector在单词中进行类似的搜索方式:

where("(to_tsvector('english', name) @@ to_tsquery(?))", ('Blerg' + ':*'))
Run Code Online (Sandbox Code Playgroud)

上面的查询不会返回'SomethingBlergSomething'.

那么在搜索单词时如何让tsvector像ILIKE一样行事.

postgresql search full-text-search ruby-on-rails tsvector

4
推荐指数
1
解决办法
1258
查看次数

是否有一种简单的方法可以消除tsvector中lexeme的出现?

我在表中有一个tsvector列,我希望能够从tsvector中删除一个lexeme.

我开始玩ts_stat来重建一个新的tsvector,但它看起来很复杂.

有一个简单的方法吗?

postgresql tsvector

3
推荐指数
1
解决办法
414
查看次数

postgres 9.1全文搜索没有返回结果

我在网上搜索了很多天似乎互联网从来没有听说过我的问题:

我有一个邮政地址数据库表,其中包含大约37M的英国记录,其中包含地理空间索引和衍生的全文索引,如下所示:

create index on gb_locations using gin(to_tsvector('english', "Postcode" || ' ' || "Postcode_outcode" || ' ' || "Road" || ' ' || "Neighbourhood" || ' ' || "Admin2" || ' ' || "Admin3");)
Run Code Online (Sandbox Code Playgroud)

我的全文搜索形式如下:

SELECT * FROM gb_locations
WHERE
    to_tsvector('english', "Postcode" || ' ' || "Postcode_outcode" || ' ' || "Road" || ' ' || "Neighbourhood" || ' ' || "Admin2" || ' ' || "Admin3") @@ plainto_tsquery('english', 'greenham road rg14')
Run Code Online (Sandbox Code Playgroud)

该查询适用于大多数英国地址,特别是在伦敦地区,但对于更远的地方,查询不会返回任何结果.

我已经验证表中存在记录,因为我可以使用地理空间搜索找到它,但对于全文搜索,似乎数据库不知道它.

这是解释:

Bitmap Heap Scan on gb_locations …
Run Code Online (Sandbox Code Playgroud)

postgresql full-text-search full-text-indexing tsvector psql

3
推荐指数
1
解决办法
904
查看次数

如果任何列在 PostgreSQL 全文搜索中没有数据,则 to_tsvector 为空

我正在尝试实现 Postgre SQL 全文搜索,但如果使用 to_tsvector 设置的任何列为空,我就会遇到整个文档返回空的问题。

我有一个如下所示的表:

id |   title   |   description   |
1  |   skis    |     my skis     |
2  |   bike    |                 | 
Run Code Online (Sandbox Code Playgroud)

我正在创建文档:

SELECT title, description,
setweight(to_tsvector(title), 'A'::"char") ||
setweight(to_tsvector(description), 'C'::"char")     
AS document
FROM inventory
Run Code Online (Sandbox Code Playgroud)

我希望看到的结果是:

title |  description  |  document  |
skis  |    my skis    |'ski':1A,3C |
bike  |               | 'bike':1A  | 
Run Code Online (Sandbox Code Playgroud)

但我实际得到的是:

title |  description  |  document  |
skis  |    my skis    |'ski':1A,3C |
bike  |               |            |
Run Code Online (Sandbox Code Playgroud)

这似乎是一个错误。在描述中添加任何单个字母或数字或任何内容可以使文档正确出现,但单列中的空值会导致整个文档为空。为什么需要描述才能搜索标题和描述?我误解了什么吗?

postgresql null search full-text-search tsvector

3
推荐指数
1
解决办法
1796
查看次数

是否有任何理由在 postgres 表中而不是在索引中包含一个 `tsvector` 列?

我有一个包含大约 1 亿行的表格和一个我想搜索的文本字段。我想出了两种方法来做到这一点,我想知道每种方法的性能影响。

方法 1: 这是我在网上看到的每篇博文都推荐的方法(例如12 .)。这个想法是用一ts_vector列扩充表并索引新列。
一个简单的例子是:

CREATE TABLE articles (
    id_articles BIGSERIAL PRIMARY KEY,
    text TEXT,
    text_tsv TSVECTOR
);
CREATE INDEX articles_index ON articles USING gin(text_tsv);
Run Code Online (Sandbox Code Playgroud)

然后使用触发器来确保texttext_tsv列保持最新。
然而,这对我来说似乎很浪费,因为现在TSVECTOR信息必须同时存储在表和索引中,并且数据库变得更加复杂。所以我想出了第二种方法。

方法二: 我的想法是去掉多余的列,改索引to_tsvector直接包含函数,像这样:

CREATE TABLE articles (
    id_articles BIGSERIAL PRIMARY KEY,
    text TEXT
);
CREATE INDEX articles_index ON articles USING gin(to_tsvector(text));
Run Code Online (Sandbox Code Playgroud)

问题:与方法 1 相比,使用方法 2 有什么缺点吗?

对于我的特定数据库,我使用了第二种方法,对于单个单词的简单查询,我似乎获得了合理的加速(搜索需要大约 1 秒)。但是,当我在函数中使用多个&|运算符进行复杂查询to_tsquery(并且表中只有大约 10 个匹配结果)时,搜索需要永远运行(许多小时)。如果我切换到方法 …

postgresql tsvector

3
推荐指数
1
解决办法
1175
查看次数

Postgres:如何在生成的列中包含权重?

我有以下架构:

\n
CREATE TABLE books (\n  title VARCHAR(255),\n  subtitle TEXT\n);\n
Run Code Online (Sandbox Code Playgroud)\n

添加没有权重的生成列工作正常:

\n
ALTER TABLE books ADD COLUMN full_text_search TSVECTOR\n  GENERATED ALWAYS AS (to_tsvector(\'english\',\n    coalesce(title, \'\') ||\' \'||\n    coalesce(subtitle, \'\')\n  )) STORED; -- \xe2\x9c\x85 Working\n
Run Code Online (Sandbox Code Playgroud)\n

现在我想添加权重但不起作用:

\n
ALTER TABLE books ADD COLUMN full_text_search_weighted TSVECTOR\n  GENERATED ALWAYS AS (to_tsvector(\'english\',\n    setweight(coalesce(title, \'\'), \'A\') ||\' \'||\n    setweight(coalesce(subtitle, \'\'), \'B\')\n  )) STORED; -- \xe2\x9d\x8c Not working\n
Run Code Online (Sandbox Code Playgroud)\n

有没有办法在 postgres 中生成的列中包含权重?

\n

复制链接:https://www.db-fiddle.com/f/4jyoMCicNSZpjMt4jFYoz5/1385

\n

postgresql tsvector weighted generated-columns

3
推荐指数
1
解决办法
977
查看次数

在tsvector中的每个元素上使用Levenshtein函数?

我正在尝试使用Postgres创建一个模糊搜索,并一直使用django-watson作为基础搜索引擎来解决问题.

我有一个名为search_tsv的字段,它是一个包含我要搜索的模型的所有字段值的tsvector.

我想要使​​用Levenshtein函数,它在文本字段中完全符合我的要求.但是,我真的不知道如何在tsvector的每个元素上运行它.

有没有办法做到这一点?

postgresql fuzzy-search tsvector levenshtein-distance

2
推荐指数
1
解决办法
3522
查看次数

Postgres全文搜索:多列,交叉表

我是Postgres的新手,遇到了全文搜索功能。我要实现以下目标:

  • 指定一些要搜索的表和字段。
  • 当用户搜索某些文本时,应在上面指定的表字段上进行搜索。

例如

CREATE TABLE customer (name text)
CREATE TABLE address (city text)
Run Code Online (Sandbox Code Playgroud)

搜索“ Ram”应同时找到名称“ Ram *”和城市“ Ram *”(最多10条记录)。

开放点:排名。

我了解这可能不是直截了当,但是否可以提供示例语句来实现类似效果?

postgresql full-text-search tsvector

2
推荐指数
1
解决办法
1万
查看次数