2015-01-21 7 views
1

У меня есть таблица с кучей перевалов Я создал полнотекстовый индекс на столе, как это:Postgresql - полнотекстовый поиск индекс - неожиданный запрос приводит к

CREATE INDEX phrasetable_exp_idx ON msc.mytable 
USING gin(to_tsvector('norwegian', coalesce(msc.mytable.col1,'') || ' ' || 
       coalesce(msc.mytable.col2,'') || ' ' || 
       coalesce(msc.mytable.col3,'') || ' ' || 
       coalesce(msc.mytable.col4,'') || ' ' || 
       coalesce(msc.mytable.col5,'') || ' ' || 
       coalesce(msc.mytable.col6,'') || ' ' || 
       coalesce(msc.mytable.col7,''))); 

я стараюсь несколько поисков и они молниеносно, однако, для одного конкретного поиска я не получаю ожидаемых результатов. У меня есть строка в моей таблице, где оба col1 и col2 имеют точное значение «Importkompetanse Oslo AS» в col3, оно имеет значение «9999». Только запрос to_tsquery ('9999') возвращает строку, которая показывает мне, что она имеет значение «Importkompetanse Oslo AS» в обоих столбцах col1 и col2, но первые два запроса не возвращают совпадений.

SELECT * 
FROM msc.mytable 
WHERE to_tsvector('norwegian', coalesce(msc.col1,'') || ' ' || 
       coalesce(msc.mytable.col2,'') || ' ' || 
       coalesce(msc.mytable.col3,'') || ' ' || 
       coalesce(msc.mytable.col4,'') || ' ' || 
       coalesce(msc.mytable.col5,'') || ' ' || 
       coalesce(msc.mytable.col6,'') || ' ' || 
       coalesce(msc.mytable.col7,''))); 
@@ --to_tsquery('Importkompetanse&Oslo&AS') -- nada 
    plainto_tsquery('Importkompetanse') -- nada 
    --to_tsquery('9999') -- OK! 

У кого-нибудь есть идея, почему мои поисковые запросы не дают результатов?

EDIT:

По какой-то причине, to_tsquery возвращает что-то вроде этого: " '9999': 9 'importkompetans': 1,6" Слово importkompetanse кажется отрезать?

Однако, если я устанавливаю его на простой, а не норвежский, я получаю ожидаемые результаты, и все выглядит хорошо. Почему это?

ответ

1

Вы использовали кросс-конфигурацию между значениями tsvector и tsquery. Вы должны использовать последовательную конфигурацию, как:

select to_tsvector('norwegian', 'Importkompetanse Oslo AS') 
     @@ to_tsquery('norwegian', 'Importkompetanse&Oslo&AS'); 

SQLFiddle

Вот почему он работал с конфигурацией 'simple' (то есть ваш default).

Примечание: вы всегда можете найти debug текстовый поиск с ts_debug(): f.ex. 'Importkompetanse' не был отрезан, 'importkompetans' - это только соответствующая лексема для этого слова (в конфигурации 'norwegian').

: вы используете очень длинный индекс на основе выражений, который будет использоваться только в том случае, если вы также используете точное выражение в своих запросах. Вы использовали его прямо в своем примере, но это делает ваши запросы очень длинными, и если вы измените свое индексное выражение через некоторое время, вам нужно убедиться, что все «использует» также обновлено.

Вы можете использовать простую функцию (SQL), чтобы упростить свои запросы:

create or replace function col_tsvector(mytable) 
    returns tsvector 
    immutable 
    language sql 
    as $function$ 
return to_tsvector('norwegian', 
    coalesce($1.col1, '') || ' ' || 
    coalesce($1.col2, '') || ' ' || 
    coalesce($1.col3, '') || ' ' || 
    coalesce($1.col4, '') || ' ' || 
    coalesce($1.col5, '') || ' ' || 
    coalesce($1.col6, '') || ' ' || 
    coalesce($1.col7, '')) 
$function$; 

С этим, вы можете значительно упростить определение индекса & ваши запросы тоже. (Вы можете даже использовать attribute notation.)

+0

Привет, спасибо за ценный ввод, я новичок в postgres :) Я не уверен, что вы имеете в виду под кросс-конфигурацией? То, что я пытаюсь сделать, - создать индекс, который будет соответствовать фразам, всем словам или некоторым словам и совпадениям в этом порядке, будет ли мой индекс делать это? –

+0

И слово importkompetans не является допустимым словом в норвежском языке, у нас есть составные слова, importkompetanse - действительное слово здесь. Importkomtetans будет таким же, как импорт, на английском, без последней буквы. –

+0

@ LarsAnundskås by * cross * Я имею в виду, что вы должны использовать ту же конфигурацию для вызовов to_tsvector() 'и' to_tsquery() ', как в моем примере (вы опустили параметр конфигурации из своих вызовов' to_tsquery() ' , что означает, что PostgreSQL будет использовать конфигурацию по умолчанию для этого вызова) - 'importkompetans' - это не слово, это лексема (a): (а): оно помогает полнотекстовой поисковой системе распознавать сходства, такие как множественные и отклоненные формы , и т.д. – pozs

Смежные вопросы