我们如何通过 2013 或 1434h 关键字搜索它?
看来您要替换:
to_tsquery('1434h') q
和:
to_tsquery('1434h | 2013') q
http://www.postgresql.org/docs/current/static/functions-textsearch.html
旁注:to_tsquery()
语法非常反复无常。它不允许有太多幻想,而且 Postgres 中的许多假设都是对最终用户友好的。
通常情况下,您最好使用plainto_tsquery()
,它允许向其扔任何数量的垃圾。因此,请考虑在发出查询之前对字符串进行预处理。例如,您可以将字符串和OR
原始部分拆分在一起:
where sc.text_index @@ (plainto_tsquery('1434h') || plainto_tsquery('2013'))
这样做会使您的代码更复杂一些,但它不会依赖于您的用户需要理解(与他们在 Google 中习惯的相反)他们应该输入'quick & brown & fox & jumps & lazy & dog'
而不是 plain 'The quick brown fox jumps over the lazy dog'
。
编辑:我最终实际上尝试了您的示例查询,看来您实际上遇到了解析器问题:
# SELECT alias, description, token FROM ts_debug('Astronomic Event 2013/1434H - Aceh');
alias | description | token
-----------+-------------------+------------
asciiword | Word, all ASCII | Astronomic
blank | Space symbols |
asciiword | Word, all ASCII | Event
blank | Space symbols |
file | File or path name | 2013/1434H
blank | Space symbols |
blank | Space symbols | -
asciiword | Word, all ASCII | Aceh
(8 rows)
http://www.postgresql.org/docs/current/static/textsearch-parsers.html
看起来您可能需要编写(或查找)和配置特定于应用程序的解析器。从来没有亲自这样做过,我能做的最好的就是强调 Postgres 允许这样做并包含一个示例:
http://www.postgresql.org/docs/current/static/test-parser.html
或者,更改与 tsvector 相关的触发器,使其匹配 eg\d{4}/\d+[a-zA-Z]
或任何看起来最合适的内容,并相应地添加空格,然后再将其转换为 tsvector。如果您从不需要存储文件名,那么像以下这样简单的东西可能会奏效:
SELECT alias, description, token
FROM ts_debug(replace('Astronomic Event 2013/1434H - Aceh', '/', ' / '));