3

我做了以下事情:

ALTER TABLE blog_entry ADD COLUMN body_tsv tsvector;

CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON blog_entry 
    FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(body_tsv, 'pg_catalog.english', body);

CREATE INDEX blog_entry_tsv ON blog_entry USING gin(body_tsv);

UPDATE blog_entry SET body_tsv=to_tsvector(body);

现在这是有效的:

SELECT title FROM blog_entry WHERE body_tsv @@ plainto_tsquery('hello world');

但是当尝试搜索非英文文本时,它根本不起作用(没有结果)。

我正在使用 v9.2.2

请帮忙。

4

2 回答 2

9

我玩这个已经有一段时间了,但是你需要用正确的语言创建 ts_vector,而不是 ts_query。

因此,当您更新表时,请使用:

UPDATE blog_entry SET body_tsv=to_tsvector('german', body);

您还可以扩展功能并使用 ispell 字典使词干更适合文本搜索引擎(尽管它仍然不会像 Solr 那样复杂)

为此,请下载例如包含在OpenOffice 德语词典中的 ISPELL 词典

.oxt 文件实际上是一个 .zip 文件,因此您可以简单地提取其内容。

然后将文件复制de_DE_frami.dic到 PostgreSQL“share/tsearch_data”目录,同时将扩展名更改为.dict(这是 PostgreSQL 所期望的。

然后将文件复制de_DE_frami.aff到同一目录,将扩展名更改为.affix.

您需要将两个(文本)文件都转换为 UTF-8 以便它们与 PostgreSQL 一起使用

然后使用以下命令注册该字典:

CREATE TEXT SEARCH CONFIGURATION de_config (copy=german);

CREATE TEXT SEARCH DICTIONARY german_stem (
    TEMPLATE = snowball,
    Language = german
);

CREATE TEXT SEARCH DICTIONARY german_ispell (
    TEMPLATE = ispell,
    dictfile = de_DE_frami,
    afffile = de_de_frami
);

alter text search configuration de_config 
     alter mapping for asciiword WITH german_ispell, german_stem;

完成后,您可以使用以下命令创建 ts_vector:

UPDATE blog_entry SET body_tsv=to_tsvector('de_config', body);

这也在手册中进行了描述:http ://www.postgresql.org/docs/current/static/textsearch-dictionaries.html#TEXTSEARCH-ISPELL-DICTIONARY

于 2013-01-13T08:48:04.903 回答
0

我知道这个问题已经有一段时间了,但我正在寻找更改 FTS 语言并找到了其他解决方案。(比下载字典更好)

在 Postgres CLI 上,您可以使用命令获取文本搜索配置列表:\dF

  • 检查您当前的配置:

show default_text_search_config;

  • 将您的文本搜索配置更改为另一种语言:

set default_text_search_config = 'pg_catalog.[language]';

于 2019-05-13T17:43:57.210 回答