不幸的是,解析器丢弃了所有标点符号,因此“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(c
、f
、net
等)和空白(+
、#
、.
等):
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/