postgresql - 如何在 PostgreSQL 的全文搜索中匹配 "C#"和 "C++"之类的东西?

标签 postgresql full-text-search

不幸的是,解析器丢弃了所有标点符号,因此“C”、“C++”和“C#”都以“c”结尾。

我唯一能想到的(除了替换现在不是真正选项的解析器),是在使用任何 FTS 函数之前实现我自己的微型同义词字典,将“C++”替换为“例如,在应用程序或查询中将“Cpp”和“C#”与“Csharp”结合使用。有什么方法可以使用 FTS 功能/特性来做到这一点吗?

最佳答案

字典搜索会过滤掉一些符号(空格、标点符号)和不相关的词(又名停用词:a、the…)。但是,某些编程语言包含其中一种,甚至包含两种!

为了克服这个问题,我们需要创建一个自定义同义词库,让 PostgreSQL 注意到它,将它链接到一个同样自定义的字典,因为它不能知道停用词,最后更改 ASCII 字符的配置和符号。

我们的词库应该位于/usr/local/share/postgresql/tsearch_data/,我们将其命名为prog_thesaurus.ths。它看起来像这样:

c + + : cplusplus
c # : csharp
. net : dotnet
f # : fsharp

注意单词和符号之间的空格!

现在我们需要创建一个没有停用词的自定义词典。它将基于英文:

CREATE TEXT SEARCH DICTIONARY english_nostop_stem (
    TEMPLATE = snowball,
    Language = english
);

然后我们告诉 PostgreSQL 我们的词库:

CREATE TEXT SEARCH DICTIONARY prog_thesaurus (
    TEMPLATE = thesaurus,
    DictFile = prog_thesaurus,
    Dictionary = english_nostop_stem
);

最后,我们必须将我们的同义词库映射到一些标记类型。这里我们将映射asciiword(cfnet等)和空白(+#. 等):

ALTER TEXT SEARCH CONFIGURATION english
    ALTER MAPPING FOR asciiword, blank
    WITH prog_thesaurus, english_stem;

如果我们测试我们的新配置:

SELECT * FROM ts_debug('english', 'c++');
   alias   |   description   | token |         dictionaries         | dictionary  | lexemes 
-----------+-----------------+-------+------------------------------+-------------+---------
 asciiword | Word, all ASCII | c     | {prog_thesaurus,english_stem} | english_stem | {}
 blank     | Space symbols   | +     | {prog_thesaurus,english_stem} | english_stem | {+}
 blank     | Space symbols   | +     | {prog_thesaurus,english_stem} | english_stem | {+}
(3 lignes)

耶!用的是我们的词库!并提出一点疑问:

SELECT * FROM plainto_tsquery('english','c++');
 plainto_tsquery
-----------------
 'cplusplus'
(1 ligne)

多田! c++ 被发现为 cplusplus 的出现。

关于postgresql - 如何在 PostgreSQL 的全文搜索中匹配 "C#"和 "C++"之类的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2242368/

相关文章:

php - 从 PSQL 结果集递归构建 XML(使用 PHP)

ruby-on-rails - 使用 DATE_TRUNC ('week' ),如果一周的 .sum( :points) has 0?

sql - 自动维护父表中 child 的总数

postgresql - 无法构建 Hibernate SessionFactory - spring data/jpa/hibernate 逆向工程

php - 使用 MariaDB 的 SphinxSE 基本语法问题

mysql - 理解全文 bool 模式结果

postgresql - Postgres 三元组搜索中 AND OR NOT 的语法是什么?

java - 尝试使用 JDBC 连接 Heroku 数据库时未找到合适的驱动程序

java - Lucene 和访问控制(评论的可见性)

Mysql全文 boolean 忽略短语