1

我有这个文本(取自连接字段行)

Astronomic Event 2013/1434H - Aceh ....

我们如何通过20131434h关键字搜索它?

我尝试了下面的代码,但结果没有行。

to_tsvector结果:

'2013/1434h':8,12 'aceh':1 'bin.....

示例案例:

WITH sample_table as
  (SELECT to_tsvector('Astronomic Event 2013/1434H - Aceh') sample_content)

SELECT *
    FROM sample_table, to_tsquery('2013') q
WHERE sample_content @@ q
4

1 回答 1

1

我们如何通过 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', '/', ' / '));
于 2013-06-15T10:14:43.780 回答