postgres中全文搜索的问题

问题描述 投票:2回答:2

我有下一个表和数据:

/* script for people table, with field tsvector and gin */

CREATE TABLE public.people (
  id INTEGER,
  name VARCHAR(30),
  lastname VARCHAR(30),
  complete TSVECTOR
) 
WITH (oids = false);

CREATE INDEX idx_complete ON public.people
  USING gin (complete);

/* data for people table */

INSERT INTO public.people ("id", "name", "lastname", "complete")
VALUES 
  (1, 'MICHAEL', 'BRYANT BRYANT', '''bryant'':2,3 ''michael'':1'),
  (2, 'HENRY STEVEN', 'BUSH TIESSEN', '''bush'':3 ''henri'':1 ''steven'':2 ''tiessen'':4'),
  (3, 'WILLINGTON STEVEN', 'STEPHENS FLINN', '''flinn'':4 ''stephen'':3 ''steven'':2 ''willington'':1'),
  (4, 'BRET', 'MARTINEZ AROCH', '''aroch'':3 ''bret'':1 ''martinez'':2'),
  (5, 'TERENCE BERT', 'CAVALIERE ENRON', '''bert'':2 ''cavalier'':3 ''terenc'':1');

根据tsvector字段,我需要检索名称和姓氏。其实我有查询:

SELECT * FROM people WHERE complete @@ to_tsquery('WILLINGTON & FLINN');

结果是对的(第三条记录)。但是,如果我尝试

SELECT * FROM people WHERE complete @@ to_tsquery('STEVEN & FLINN');
/* the same record! */

我没有结果。为什么?我能做什么?

postgresql full-text-search
2个回答
0
投票

您应使用相同的语言搜索表格,作为插入字段“完成”中的值。

检查该查询的结果,比较英语和德语:

select * ,
to_tsvector('english', concat_ws(' ', name, lastname )) as english,
to_tsvector('german', concat_ws(' ', name, lastname )) as german
from public.people 

所以这应该适合你:

SELECT * FROM people WHERE complete @@ to_tsquery('english','STEVEN & FLINN');

0
投票

您可能正在使用文本搜索配置,其中STEVENFLINN通过词干修改。

我可以在这里重现:

test=> SHOW default_text_search_config;
 default_text_search_config 
----------------------------
 pg_catalog.german
(1 row)

test=> SELECT complete FROM public.people WHERE id = 3;
                    complete                     
-------------------------------------------------
 'flinn':4 'stephen':3 'steven':2 'willington':1
(1 row)

test=> SELECT * FROM ts_debug('STEVEN & FLINN');
   alias   |   description   | token  | dictionaries  | dictionary  | lexemes 
-----------+-----------------+--------+---------------+-------------+---------
 asciiword | Word, all ASCII | STEVEN | {german_stem} | german_stem | {stev}
 blank     | Space symbols   |        | {}            |             | 
 blank     | Space symbols   | &      | {}            |             | 
 asciiword | Word, all ASCII | FLINN  | {german_stem} | german_stem | {flinn}
(4 rows)

test=> SELECT * FROM public.people
       WHERE complete @@ to_tsquery('STEVEN & FLINN');
 id | name | lastname | complete 
----+------+----------+----------
(0 rows)

所以你看,德国雪球词典将STEVEN带到了stev

由于complete包含未开发的版本steven,因此找不到匹配项。

在填充complete时和查询中应使用相同的文本搜索配置。

© www.soinside.com 2019 - 2024. All rights reserved.