5

我正在使用 Postgresql 进行全文搜索,但在创建过滤词库时遇到了麻烦,按照 Postgresql 文档中关于使用字典的全文搜索 (12.6) 的描述。

我知道文档只讨论了一个过滤字典,它是一个程序,它接受一个标记作为输入并返回一个带有 TSL_FILTER 标志集的单个词素,用一个新的标记替换原始标记,以传递给后续的字典。我的问题是:是否可以创建一个词库,它接受一个短语(1-3 个标记)并返回一个带有 TSL_FILTER 标志集的单个词素,该标志集被传递给后续字典或词库?如果是这样,我做错了什么?

我尝试创建一个名为 dict_fths 的新扩展,它与 Postgresql 提供的默认词库基本相同,只是短语映射到的每个词素都设置了 TSL_FILTER 标志。我通过以下方式创建了两个名为 fths 和 second_ths 的文本搜索词典:

# CREATE EXTENSION dict_fths;
# CREATE TEXT SEARCH DICTIONARY fths (
    template=fths_template, 
    dictionary=english_stem, 
    dictfile=fths_sample
);
# CREATE TEXT SEARCH DICTIONARY second_ths (
    template=thesaurus,
    dictionary=english_stem,
    dictfile=second_ths
);
# CREATE TEXT SEARCH CONFIGURATION test ( COPY=pg_catalog.english );
# ALTER TEXT SEARCH CONFIGURATION test 
  ALTER MAPPING FOR asciihword, asciiword, hword, hword_asciipart, hword_part, word
  WITH fths, second_ths, english_stem;

当映射在单个标记和单个词位之间时,dict_fths 行为正确。

fths_sample.ths 条目:

ski : sport

second_ths.ths 条目:

sport competition : *sporting-event

输出(正确,正确):

# select to_tsvector('test', 'ski');
    to_tsvector
  ---------------
   'sport':1
(1 row)

# select to_tsvector('test', 'ski competition');
    to_tsvector
  ---------------
   'sporting-event':1
(1 row)

但是,当我编辑 ths 文件以包含短语时,我不再得到我想要的输出:

fths_sample.ths 条目:

ski : sport
ski jumping : sport

输出(正确,正确,不正确,不正确):

# select to_tsvector('test','ski');
    to_tsvector
  ---------------
   'sport':1
(1 row)

# select to_tsvector('test','ski jumping');
    to_tsvector
  ---------------
   'sport':1
(1 row)

# select to_tsvector('test' 'ski competition');
    to_tsvector
  ---------------
   'sport':1 'competit':2
(1 row)

# select to_tsvector('test', 'ski jumping competition');
    to_tsvector
  ---------------
   'sport':1 'competit':2
(1 row)

即使在我编辑了 fths_sample.ths 文件后,输出仍然不正确:

fths_sample.ths 包含:

ski jumping : sport

这是输出(正确,不正确):

# select to_tsvector('test', 'ski jumping');
    to_tsvector
  ---------------
   'sport':1
(1 row)

# select to_tsvector('test', 'ski jumping competition');
    to_tsvector
  ---------------
   'sport':1 'competit':2
(1 row)

因此,当 1)它有超过 1 个标记 2)它是较长短语的一部分时,词库似乎无法通过词位。

4

0 回答 0