powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите запустить полнотекстовый поиск в 8.3
9 сообщений из 9, страница 1 из 1
Помогите запустить полнотекстовый поиск в 8.3
    #35200703
rkorotovskikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые знатоки Postgresql, такая проблема:

На WinXP установлен PostgreSQL 8.3. Есть таблица my_catalogs (id serial, text tsvector).
Создал я таблицу, занем туда несколько строк для теста.

Как мне организовать полнотекстовый поиск в данной таблице, так что бы работало! Прочитал документацию и мало что понял - я не ИТ специалист.
Вот собственно и прошу помощи:
1. как создать индекс по полю text
2. как сделать так, что бы этот индекс обновлялся при вводе новых данных
3. как производить поиск по некоторым ключевым словам (2 -3 слова или какое-нибудь предложение).

Помогите примером, очень нужно!!!
Всем спасибо!
...
Рейтинг: 0 / 0
Помогите запустить полнотекстовый поиск в 8.3
    #35201412
MoroZ.Ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня тоже стоит задача запустить полнотекстовый поиск, только на Linux.

В Вашем примере в таблице my_catalogs должно быть 3 поля:
id - код,
text - оригинал текста,
vect_text - векторное (обработанное) представление текста

CREATE TABLE my_catalogs (id serial, text text, vect_text tsvector);

1. Создание индексов:
CREATE INDEX my_catalog_id_idx ON my_catalog(id);
CREATE INDEX my_catalog_text_idx ON my_catalog(text);


2. При добавлении данных индекс будет обновляться автоматически. А вот для автоматического обновления векторного представления текста нужно написать триггер:

CREATE OR REPLACE FUNCTION my_catalog_ins() RETURNS trigger AS $$
BEGIN
NEW.vect_text = to_tsvector(NEW.text);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER my_catalog_ins_trigger BEFORE INSERT OR UPDATE ON my_catalog
FOR EACH ROW EXECUTE PROCEDURE my_catalog_ins();


3. Поиск производить так:

SELECT id FROM my_catalog WHERE 'alpha&beta&gamma...'::tsquery @@ vect_text;
или так
SELECT id FROM my_catalog WHERE to_tsquery('alpha&beta&gamma...') @@ vect_text;

где alpha, beta, gamma - искомые слова
...
Рейтинг: 0 / 0
Помогите запустить полнотекстовый поиск в 8.3
    #35201430
MoroZ.Ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот у меня такая проблема. Как работать с полнотекстовым поиском я примерно понял, а вот как подключить всякие словари-тезаурусы и т.п. штуки, чет не могу понять. Может кто уже работал с этим, подскажите, че искать, куда копировать, как подключать. А то у меня поиск не правильно работает с русскими окончаниями.
...
Рейтинг: 0 / 0
Помогите запустить полнотекстовый поиск в 8.3
    #35201914
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
перво-наперво, нужно понять, какие нужны словари.

Есть словари подмен, в которых вы сами можете написать синонимы.
слово синоним
слово2 -синоним
и т.д. строчка за строчкой.

Код: plaintext
1.
2.
3.
4.
CREATE TEXT SEARCH DICTIONARY mydict_dict (
    TEMPLATE = synonym,
    SYNONYMS = ru_mydict
);
Есть словари, которые понимают морфологию (красный, красного) - это ispell.
Код: plaintext
1.
2.
3.
4.
5.
CREATE TEXT SEARCH DICTIONARY mydict_russian_ispell (
    TEMPLATE = ispell,
    DictFile = russian,
    AffFile = russian,
    StopWords = russian
);
Есть словари, которые лишь знают артикли, местоимения и пр. Их они отбрасывают, а затем видят подобие слов без понимания словоформ (красн, красного) - это snowball.
Код: plaintext
1.
2.
3.
4.
5.
CREATE TEXT SEARCH DICTIONARY mydict_russian_stem (
    TEMPLATE = snowball,
    Language = russian,
    StopWords = russian
);

И те и другие можно скачать, если нет в вашей поставке.
Для 8.3 все словари должны быть в кодировке utf-8, независимо от кодировки вашего кластера и локали. Словари лежат в /usr/share/postgresXX/tsearch_data или что то в этом роде.
Не побрезгуйте посмотреть. Там есть примеры.

У файлов словарей расширения:
*.affix - суффиксы словоформ
*.dict - собственно словари
*.stop - стоп-слова (местоимения, предлоги и т.д.)
В определениях словарей, которые я привел выше, эти суффиксы не указаны, но они подразумеваются .

Есть конструкция для определения словарей со включением полного имени файла и пути к нему, но у меня она не работает.

Далее, можно определить собственную конфигурацию со своими словарями:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TEXT SEARCH CONFIGURATION public.mydict_ru (PARSER = default);
COMMENT ON TEXT SEARCH CONFIGURATION public.mydict_ru IS 'conf. for mydict ru';

ALTER TEXT SEARCH CONFIGURATION mydict_ru ADD MAPPING 
  FOR email, url, url_path, host, file, version,
    sfloat, float, int, uint,
    numword, hword_numpart, numhword
  WITH simple;
--
ALTER TEXT SEARCH CONFIGURATION mydict_ru ADD MAPPING 
  FOR asciiword, hword_asciipart, asciihword
  WITH mydict_english_ispell, english_stem;
--
ALTER TEXT SEARCH CONFIGURATION mydict_ru ADD MAPPING 
  FOR word, hword_part, hword
  WITH mydict_dict, mydict_russian_stem, mydict_russian_ispell;
...
Рейтинг: 0 / 0
Помогите запустить полнотекстовый поиск в 8.3
    #35202724
MoroZ.Ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сегодня на основе ваших рекомендаций попробовал замутить такую конфигурацию:

BEGIN;

CREATE TEXT SEARCH DICTIONARY mydict_russian_ispell (
TEMPLATE = ispell,
DictFile = russian,
AffFile = russian,
StopWords = russian
);

CREATE TEXT SEARCH DICTIONARY mydict_russian_auto_synonyms ( -- Мой словарь синонимов автомобильной направленности
TEMPLATE = synonym,
SYNONYMS = russian_auto
);

CREATE TEXT SEARCH DICTIONARY mydict_russian_stem (
TEMPLATE = snowball,
Language = russian,
StopWords = russian
);

CREATE TEXT SEARCH CONFIGURATION public.mydict_ru (PARSER = default);
COMMENT ON TEXT SEARCH CONFIGURATION public.mydict_ru IS 'conf. for mydict ru';

ALTER TEXT SEARCH CONFIGURATION mydict_ru ADD MAPPING
FOR email, url, url_path, host, file, version,
sfloat, float, int, uint,
numword, hword_numpart, numhword
WITH simple;

/* Пришлось закомментировать, т.е. при компиляции Postgres "ругалсо"
ALTER TEXT SEARCH CONFIGURATION mydict_ru ADD MAPPING
FOR asciiword, hword_asciipart, asciihword
WITH mydict_english_ispell, english_stem;
*/

ALTER TEXT SEARCH CONFIGURATION mydict_ru ADD MAPPING
FOR word, hword_part, hword
WITH mydict_russian_auto_synonyms, mydict_russian_stem, mydict_russian_ispell;

END;



ISpell вроде бы работает. Проверял конструкцией:

# SELECT ts_lexize('mydict_russian_ispell', 'подшипника');
ts_lexize
-------------
{подшипник}
(1 row)

Да и словарь синонимов работает. Только мне хотелось бы использовать в словаре синонимы, которые включают в себя два-три-четыре слова. Например: "ШРУС" - "шарнир равных угловых скоростей" или "стекло ветровое" - "стекло лобовое". Сейчас словарь синонимов понимает только одно слово и поэтому для слова "стекло" выдает синоним "ветровое". Как решить эту проблему? Пробовал применять ', ", {} - не работает.

И еще вопрос. Ispell не знает некоторых автомобильных терминов. Например, не знает слов "тосол" и "бендикс". Где найти описание, как нужные слова можно добавить в словарь?
...
Рейтинг: 0 / 0
Помогите запустить полнотекстовый поиск в 8.3
    #35203040
rkorotovskikh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите запустить полнотекстовый поиск в 8.3
    #35203124
MoroZ.Ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал конфигурацию в деле. Запрос

# SELECT ИМЯ FROM прайс WHERE 'подшипник&ступиц ы &2101'::tsquery @@ ВЕКТОР;

выдал 21 строку из справочника.

Подшипник ступицы 2101 бол. АТ
Подшипник ступицы 2101 мал. АТ
Подшипник ступицы 2101 передн. KRAFT (компл.)
Подшипник ступицы 2101 передн. Herzog (2шт.) (Германия)
Подшипник ступицы 2101 передний внутрен. WEGO (Чехия)
Подшипник ступицы 2101 передний наружн. WEGO (Чехия)
Подшипник ступицы 2101 передн. бол Master-Sport (26*57,15*17,46) (Германия)
Подшипник ступицы 2101 передн.мал. Master-Sport (19,5*45,25*16,63) (Германия)
...
(21 rows)


А запрос

# SELECT ИМЯ FROM прайс WHERE 'подшипник&ступиц а &2101'::tsquery @@ ВЕКТОР;

не выдал ни одной строки, хотя справочник ispell присутствует и как будто работает:

# SELECT ts_lexize('mydict_russian_ispell', 'ступицы');
ts_lexize
-----------
{ступица}
(1 row)

Почему морфологический разбор не работает?
...
Рейтинг: 0 / 0
Помогите запустить полнотекстовый поиск в 8.3
    #35204056
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используйте тег SRC сообщениях:
Код: plaintext
select to_tsvector('подшипников & ступицей');
...
Рейтинг: 0 / 0
Помогите запустить полнотекстовый поиск в 8.3
    #35204126
MoroZ.Ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что это за тег SRC? Можно подробнее?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите запустить полнотекстовый поиск в 8.3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]