搜索文本索引

创建文本索引后,请编写一个查询,并对该索引运行查询,从而搜索特定关键字。

在下面的示例中,可以使用 WHERE 子句搜索文本索引中的关键字 <WARNING>。WHERE 子句应使用创建文本索引时使用的词干分析器。使用 STEMMER 关键字时,它会分析关键字词干,以便与文本索引中的关键字匹配。如果未使用 STEMMER 关键字,则默认词干分析器为 v_txtindex.StemmerCaseInsensitive。如果使用了 STEMMER NONE,则可以省略 WHERE 子句中的 STEMMER 关键字。

=> SELECT * FROM text_index WHERE token = v_txtindex.StemmerCaseInsensitive('<WARNING>');
  token    | doc_id
-----------+--------
<warning>  |     2
<warning>  |     3
<warning>  |     4
<warning>  |     5
(4 rows)

接下来,编写查询,显示与在文本索引中搜索的关键字匹配的所有源表内容。

=> SELECT * FROM t_log WHERE id IN (SELECT doc_id FROM text_index WHERE token = v_txtindex.StemmerCaseInsensitive('<WARNING>'));
id |    date    |                                     text
---+------------+-----------------------------------------------------------------------------------------------
4  | 2014-06-04 | 11:00:49.568 unknown:0x7f9207607700 [Catalog] <WARNING> validateDependencies: Object 45035968
5  | 2014-06-04 | 11:00:49.568 unknown:0x7f9207607700 [Catalog] <WARNING> validateDependencies: Object 45030
2  | 2013-06-04 | 11:00:49.568 unknown:0x7f9207607700 [Catalog] <WARNING> validateDependencies: Object 4503
3  | 2013-06-04 | 11:00:49.568 unknown:0x7f9207607700 [Catalog] <WARNING> validateDependencies: Object 45066
(4 rows)

使用 doc_id 可以查找源表中关键字的确切位置。doc_id 会与源表的唯一标识符匹配。此匹配有助于迅速找出表中的关键字实例。

执行区分大小写和不区分大小写的文本搜索查询

文本索引会经过优化,以便根据词干分析器与所有单词实例匹配。默认情况下,不区分大小写的词干分析器会应用于未指定词干分析器的所有文本索引。因此,如果您计划针对文本索引编写的查询区分大小写,则 Vertica 建议使用区分大小写的词干分析器来构建文本索引。

以下示例显示了执行文本搜索时,可用来在区分大小写和不区分大小写的情况下与单词匹配的查询。

此查询会在不区分大小写的文本索引中查找不区分大小写的记录:

=> SELECT * FROM t_log WHERE id IN (SELECT doc_id FROM text_index WHERE token = v_txtindex.StemmerCaseInsensitive('warning'));

此查询会在区分大小写的文本索引中查找区分大小写的记录:

=> SELECT * FROM t_log_case_sensitive WHERE id IN (SELECT doc_id FROM text_index WHERE token = v_txtindex.StemmerCaseSensitive('Warning'));

在文本搜索查询中包括和排除关键字

使用文本索引时也可以执行更详细的查询,找出多个关键字或忽略含有其他关键字的结果。以下示例显示了一个更详细的查询,您可以在执行文本搜索时使用该查询。

在此示例中,t_log 是源表,text_index 是文本索引。查询会查找含有以下任一内容的记录:

  • 同时含有 '<WARNING>’ 和 'validate' 单词的记录

  • 只含有 '[Log]' 单词且不含有 'validateDependencies' 的记录

SELECT * FROM t_log where (
   id IN (SELECT doc_id FROM text_index WHERE token = v_txtindex.StemmerCaseSensitive('<WARNING>'))
      AND (   id IN (SELECT doc_id FROM text_index WHERE token = v_txtindex.StemmerCaseSensitive('validate')
      OR id IN (SELECT doc_id FROM text_index WHERE token = v_txtindex.StemmerCaseSensitive('[Log]')))
      AND NOT (id IN (SELECT doc_id FROM text_index WHERE token = v_txtindex.StemmerCaseSensitive('validateDependencies'))));

此查询会返回以下结果:

id  |   date     |                               text
----+------------+------------------------------------------------------------------------------------------------
11  | 2014-05-04 | 11:00:49.568 unknown:0x7f9207607702 [Log] <WARNING> validate: Object 4503 via fld num_all_roles
13  | 2014-05-04 | 11:00:49.568 unknown:0x7f9207607706 [Log] <WARNING> validate: Object 45035 refers to root_i3
14  | 2014-05-04 | 11:00:49.568 unknown:0x7f9207607708 [Log] <WARNING> validate: Object 4503 refers to int_2
17  | 2014-05-04 | 11:00:49.568 unknown:0x7f9207607700 [Txn] <WARNING> Begin validate Txn: fff0ed17 catalog editor
(4 rows)