我在表上允许我执行全文搜索的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
提前致谢
大卫
所以我想说我会搜索'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一样行事.
我在表中有一个tsvector列,我希望能够从tsvector中删除一个lexeme.
我开始玩ts_stat来重建一个新的tsvector,但它看起来很复杂.
有一个简单的方法吗?
我在网上搜索了很多天似乎互联网从来没有听说过我的问题:
我有一个邮政地址数据库表,其中包含大约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
我正在尝试实现 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)
这似乎是一个错误。在描述中添加任何单个字母或数字或任何内容可以使文档正确出现,但单列中的空值会导致整个文档为空。为什么需要描述才能搜索标题和描述?我误解了什么吗?
我有一个包含大约 1 亿行的表格和一个我想搜索的文本字段。我想出了两种方法来做到这一点,我想知道每种方法的性能影响。
方法 1: 这是我在网上看到的每篇博文都推荐的方法(例如1和2 .)。这个想法是用一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)
然后使用触发器来确保text和text_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 个匹配结果)时,搜索需要永远运行(许多小时)。如果我切换到方法 …
我有以下架构:
\nCREATE TABLE books (\n title VARCHAR(255),\n subtitle TEXT\n);\nRun Code Online (Sandbox Code Playgroud)\n添加没有权重的生成列工作正常:
\nALTER 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\nRun Code Online (Sandbox Code Playgroud)\n现在我想添加权重但不起作用:
\nALTER 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\nRun Code Online (Sandbox Code Playgroud)\n有没有办法在 postgres 中生成的列中包含权重?
\n复制链接:https://www.db-fiddle.com/f/4jyoMCicNSZpjMt4jFYoz5/1385
\n我正在尝试使用Postgres创建一个模糊搜索,并一直使用django-watson作为基础搜索引擎来解决问题.
我有一个名为search_tsv的字段,它是一个包含我要搜索的模型的所有字段值的tsvector.
我想要使用Levenshtein函数,它在文本字段中完全符合我的要求.但是,我真的不知道如何在tsvector的每个元素上运行它.
有没有办法做到这一点?
我是Postgres的新手,遇到了全文搜索功能。我要实现以下目标:
例如
CREATE TABLE customer (name text)
CREATE TABLE address (city text)
Run Code Online (Sandbox Code Playgroud)
搜索“ Ram”应同时找到名称“ Ram *”和城市“ Ram *”(最多10条记录)。
开放点:排名。
我了解这可能不是直截了当,但是否可以提供示例语句来实现类似效果?