Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Полнотекстовый поиск в новых версиях SQL Server: скорость увеличилась?

Сейчас используется SQL Server 2005.
Меня интересует личный опыт и мнение тех, кто начал применять полнотекстовый поиск
в версии 2005 и затем переходил на более новые версии.

Проблема в том, что данных и пользователей за 6 лет стало больше,
и теперь скорости полнотекстового явно недостаточно.
Начали поглядывать в сторону связки PostgreSQL + Sphinx,
но это же всю систему придётся переделывать...

А что если перейти на более новую версию SQL Server, будет ли выигрыш в скорости?
Я помню, что переход с версии 2000 на 2005 дал ощутимый выигрыш в скорости
создания и обновления полнотекстовых индексов.
Может переход с 2005 на 2008 или 2012 тоже что-нибудь даст?
Или полнотекстовый движок не претерпел значительных изменений?
Ответ: Спасибо за ответы!
Я понял, что для начала надо попробовать полнотекстовый поиск в SQL2008.
Вопрос: Полнотекстовый поиск не выдает результаты по некторым запросам

Добрый день, коллеги.

Впервые пробую использовать полнотекстовый поиск.

Создаю индекс для данной таблицы :
ALTER TABLE models_version ADD COLUMN search_fts tsvector;

UPDATE models_version SET search_fts =
setweight( coalesce( to_tsvector('ru', name),''),'A') || ' ' ||
setweight( coalesce( to_tsvector('ru', description),''),'B');

CREATE INDEX search_fts_index ON models_version USING gin (search_fts);


Триггерная функция :
CREATE FUNCTION models_version_vector_update() RETURNS TRIGGER AS $$
BEGIN
    IF (TG_OP = 'UPDATE') THEN
        IF ( OLD.name <> NEW.name OR OLD.description <> NEW.description) THEN
            NEW.search_fts := setweight( coalesce( to_tsvector('ru', NEW.name),''),'A') || ' ' ||
                setweight( coalesce( to_tsvector('ru', NEW.description),''),'B');
            RETURN NEW;
        ELSE
                RETURN NEW;
        END IF;
    ELSIF (TG_OP = 'INSERT') THEN
        NEW.search_fts := setweight( coalesce( to_tsvector('ru', NEW.name),''),'A') || ' ' ||
            setweight( coalesce( to_tsvector('ru', NEW.description),''),'B');
        RETURN NEW;
    END IF;
    RETURN NULL;
END;
$$ LANGUAGE 'plpgsql';

CREATE TRIGGER models_version_fts_update BEFORE INSERT OR UPDATE ON models_version
FOR EACH ROW EXECUTE PROCEDURE models_version_vector_update();


Вроде бы поиск начинает работать, но работает странно - по каким-то запросам результаты находятся, по каким-то нет.
Записи со всеми искомыми словами в таблице имеются.
К примеру, этот запрос результат выдает :

SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('краны') ; 


А эти запросы - нет :

SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('двери') ; 
SELECT id_model FROM models_version WHERE is_delete = false AND search_fts @@ to_tsquery('окна') ; 


В поле search_fts вот такая информация хранится :

'автоматический':2A,5B 'дверь':1A,4B 'коридор':3A,6B

'jw':1A,6B 'беринг':3A,8B 'дверь':2A,7B 'двойной':4A,9B 'экстерьер':5A,10B

'swing':2A 'top':1A 'алюминиевый':8B 'верхний':3B 'внешний':5B 'вращающийся':4B 'окно':6B 'покрытие':9B



Подскажите, в чем может быть причина такого поведения поиска?
Что я делаю не так?

Спасибо.
Ответ:
Oleg Bartunov
21 февраля в 19 pm ГАИШ МГУ будет проходить митап "Полнотекстовый поиск: рецепты от разработчиков.".


материалы будут доступны в нтернете?
Вопрос: Полнотекстовый поиск не ищет некоторые (много!) слов

Неожиданно выяснилось, что FTS не ищет ряд слов.

Проверить очень просто, создадим таблицу product с полями id, title (nvarchar(max)), включим полнотекстовый поиск, заполним одним товаром - "Плед полное с рукавами"

Запросы указанные ниже вернут пустой результат
SELECT * FROM [product] where CONTAINS (title, 'FORMSOF(INFLECTIONAL, "полное")')
SELECT * FROM [product] where FREETEXT (title, 'полное')

Эти запросы же вернут данную позицию.
SELECT * FROM [product] where CONTAINS (title, 'FORMSOF(INFLECTIONAL, "плед")')
SELECT * FROM [product] where CONTAINS (title, 'FORMSOF(INFLECTIONAL, "рукав")')

Причем словоформы ms sql знает.
SELECT display_term FROM sys.dm_fts_parser(N'FORMSOF(INFLECTIONAL, "полное")', 1049, 0, 1)

полна полная полнее полно полного полной полном полному полною полную полны полные полный полным полными полных полон полное

Например если взять фразу "Хороший муж, когда найдет заначку жены, должен добавить в неё денег."
То по словам "хороший", "когда", "должен", - поиск вернет пустой результат, по остальным - верный.

Проблема проявляется на mssql 2012.

Подскажите пожалуйста, в чем может быть причина?
Ответ: invm,

Спасибо за ответ.

Пример через час поиск заработал, видимо было долгое индексирование.
Список стоп-слов пуст, все равно спасибо за ответ!
Вопрос: полнотекстовый поиск в БД MS SQL (1C) - необходимо изменить критерии поиска

Всем привет.
вопрос на тему полнотекстового поиска.
необходимо изменить какие-то параметры в sql (изменить настройки в SQL Management STUDIO - база, хранимые процедуры, etc). чтобы порции текста, которые выдает система полнотекстового поиска в 1С по текстовым файлам стали больше (нужно чтобы в этот кусок заведомо входило предложение полностью, для возм. его анализа).

т.е. более подробно.
в конфигурации 1С документооборот 8, формат базы MS SQL Server
обработка полнотекстовый поиск данных, допустим, берем ключевое слово "сумма" и делаем по нему поиск.
результаты выдаются списком, для текстовых файлов идет расшифровка вида:

Текст: Технические условия», стоимость оборудования – Сумма Валюта Срок аренды оборудования составляет: , с...

Длина этого фрагмента фиксированная. Нужна возможность его увеличения
Если в общем виде индексы разбросаны по разным таблицам, то конкретно для объекта
Справочник Файлы, Версии файлов для файлов которые поддаются индексированию (из них извлекается текст).

PS смог создать сообщение только на этой ветке.

К сообщению приложен файл. Размер - 92Kb
Ответ: Чиво? Чиво?
Вопрос: Полнотекстовый поиск блокирует таблицу [РЕШЕНО]

MySQL engine: InnoDB
MySql version: 5.6.31

1.Запускаем простой запрос

SELECT o.id
FROM tbl_oper o
WHERE o.id_oper_tip = 8 AND o.id_oper_naim = 6;


результат: 7 строк

2. Запускаем запрос с полнотекстовым поиском на этой же таблице

SELECT
    o.id,
    MATCH(o.full_text_search) AGAINST('7930' IN BOOLEAN MODE) 'match'
FROM tbl_oper o
WHERE 0 < MATCH(o.full_text_search) AGAINST('7930' IN BOOLEAN MODE)


результат: 6 строк (не так важно)

3. Повторяем первый запрос, результат: 0 строк, но полнотекстовый поиск по-прежнему работает правильно.

4. Первый запрос будет снова работать, только после перезагрузки сервера.

На результат не влияет способ запуска запросов: с одного подключения или с нескольких, с IDE, с терминала или из приложения.
Задавал этот вопрос на stackoverflow. Предложили проверить базу на ошибки, проверил командой mysqlcheck -A -e --auto-repair. У всех таблиц статус ОК.
Ответ:
Вася Гайкин
Здравствуйте, пожалуйста добавте к теме tag [РЕШЕНО]. Я сам не нашел, где можно тему отредактировать
Обычно у нас такое не практикуется, но специально по просьбе - добавил.
Вопрос: MySql 5.5 - полнотекстовый поиск по цифре не работает

Здравствуйте. Использую MySql 5.5 на живом сервере и MySql 5.6 на локальном.
Тип таблицы - InnoDB. Использую полнотекстовый поиск. Поисковый запрос довольно большой, поэтому приведу только тот участок, который относится к делу.

К примеру, есть текстовая строка в базе данных, содержащая следующий текст (адресс компании):
Код
Kungsg. 84 
112 27 Stockholm 
Stockholms län
Если я использую такой запрос к этим данным:
MySQL
1
2
3
4
5
6
7
8
9
AND (
    MATCH (CrmCompany.location) AGAINST ('"Kungsg"')
    OR CrmCompany.id IN (
        SELECT CrmCompanyContact.company_id
        FROM crm_company_contact AS CrmCompanyContact
        WHERE 
            MATCH (CrmCompanyContact.value) AGAINST ('"Kungsg"')
    )
)
То запрос возвращает искомую компанию. Но если же я хочу найти ее по номеру дома, то запрос возвращает пустой результат:
MySQL
1
2
3
4
5
6
7
8
9
AND (
    MATCH (CrmCompany.location) AGAINST ('"84"')
    OR CrmCompany.id IN (
        SELECT CrmCompanyContact.company_id
        FROM crm_company_contact AS CrmCompanyContact
        WHERE 
            MATCH (CrmCompanyContact.value) AGAINST ('"84"')
    )
)
Что не так? Где ошибка?
Заранее спасибо!

Добавлено через 1 час 19 минут
Изменил переменную.
Код
ft_min_word_len=1
Не помогает
Ответ: см. и особенно это замечание:

Note
By default, words less than 3 characters in length or greater than 84 characters in length do not appear in an InnoDB full-text search index.
Вопрос: Полнотекстовый поиск при помощи Oracle Text, почему не ищет?

Доброго времени суток!

Пробовал сделать полнотекстовый поиск при помощи Oracle Text. Все сделал как в
создание индекса прошло без ошибок.

Запрос select * from docs where contains(text, 'саша') > 0; возвращает нужную строку, а вот

select * from docs where contains(text, '$идти') > 0; ничего не возвращает.

Если просмотреть служебную таблицу DR$DOCS_IDX$I, то в TOKEN_TEXT есть значение "ИДТИ"

В чем может быть причина?
Ответ: Все таки дело в кодировке.

Поставил 12.2.0.1 с параметрами:

автор
SELECT * FROM nls_database_parameters;

NLS_RDBMS_VERSION 12.2.0.1.0
NLS_NCHAR_CONV_EXCP FALSE
NLS_LENGTH_SEMANTICS BYTE
NLS_COMP BINARY
NLS_DUAL_CURRENCY $
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_SORT BINARY
NLS_DATE_LANGUAGE AMERICAN
NLS_DATE_FORMAT DD-MON-RR
NLS_CALENDAR GREGORIAN
NLS_NUMERIC_CHARACTERS .,
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET AL32UTF8
NLS_ISO_CURRENCY AMERICA
NLS_CURRENCY $
NLS_TERRITORY AMERICA
NLS_LANGUAGE AMERICAN

и все заработало.

Всем спасибо за помощь.
Вопрос: Как правильно сделать поиск?

есть 2 таблицы:
1. уникальные тексты анкоров. Около 2,5 млн записей, 180 мб. Поиск по ней, например, ilike '%webimho%' занимает 6 секунд.
2. уникальные тексты главных. Около 5,06 записей, 67,5 гб. Поиск по ней, например, ilike '%webimho%' занимает 2,5 часа. зы греп в тхт за 15 минут нашел бы.
Я хочу сделать быстрый поиск точного и не точного вхождения (неточное в перспективе). Полнотекстовый поиск постгрес мне не подходит, так как надо указывать язык, а я их не знаю.
Допустим вторая таблица. Что я думаю сделать. Разбить текст по словам и мета тегам, перевести в нижний регистр. Разбить полученные слова по шинглам, например с размерностью 3. Создать на основе этих шинглов таблицу с полями 1. shingl3 сам шингл (создам индекс); 2. svyaz номер связи для уникальной странице главной.
Допустим мне надо найти webimho. Я разбиваю слово по шиглам и сокращаю повторы (если есть). Даю запрос, типа
select discint(svyaz) from tabl_shingl3 where
shingl3 = 'web' AND shingl3 = 'ebi' AND shingl3 = 'bim' AND shingl3 = imh' AND shingl3 = 'mho';
Полученные id записей второй таблицы 67,5 гб я буду искать уже like или ilike в зависимости от того надо соблюдать регистр или нет. Если скорость поиска на второй таблице устроит - спроецирую решение на первую.
select unik_glavnaya from tabl_unik_glavnaya where text_glavnaya ilike '%webimho%';
Вопросы:
1. Чо я делаю не так?
2. Как можно сделать совсем по другому и намного лучше?
3. Как сохранять данные в таблице шинглов?
Способ А.
шингл (3 чар) | unik_glavnaya (bigserial)
web 100
hfg 200
imh 100
imh 200
---
Способ Б
шингл (3 чар) | unik_glavnaya (text)
web '100'
hfg '200'
imh '100|200'
---
Таким образом при первом способе я буду делать выборку и сразу получать уникальные id в числовом формате. Тем не менее дублирование полнейшее, будет очень много записей.
Способом Б я смогу получать только число записей сколько у меня шинглов (нет дубликатов). Зато потом мне надо программно разобрать строки text, удалить дубликаты, преобразовать строки в число. Можно без преобразований, но тогда надо использовать уникальынм текстом главной не bigserial, а md5 сумму (сразу строковый формат фиксированный 32 символа).
зы
если чо я искать по таким большим таблицам в БД ваще не умею, любой совет мне может помочь.
Ответ: Ролг Хупин,



Я чего сказать-то хотел. Конечно можно порубить текст на куски пробелами ( или по 3 знака или еще как) и это иногда будет даже работать. Только ФТС без словаря и грамматического справочника, т.е. без информации о языке - это не ФТС. Морфология беспощадная ты с**а. Можно применить для нечеткого поиска всякие трюки: регулярки, саундексы, левенштейны, триграммы и т.п. Но это все будет проверкой на похожесть подряд идущих знаков, не более. Если ТСа это устроит то хорошо. Ему даже триграммы показали и сказали что по ним индекс можно строить. Но без инфы о языке свой яндекс не сделать, увы


.
Вопрос: Полнотекстовый поиск в SQL

Эксперты, доброго времени суток!

Дано:
SQL Server 2012 R2 x64

1.
Вопрос по полнотекстовому поиску в SQL. На сколько мне известно можно осуществлять поиск в PDF. Нашел . Есть ли что то посвежее?

2. Какие файлы кроме doc (docx) и pdf можно подвергать полнотекстовому поиску (поиск по фрагменту фразы)?

3. Есть ли проблемы с кодировками при использовании полнотекстового поиска?

Заранее премного благодарен
Ответ:
ДамирШ
Спасибо всем за столь быстрые ответы.
Ссылки
Получается iFilter разработка Adobe? Пусть платная. Покупается тоже у Aobe или через дилеров их продуктов?


В общем да, но ищите, может уже наколотили что-то бесплатное.
Вопрос: полнотекстовый поиск в postgresql

Доброе время суток!
столкнулся с такой проблемой. есть таблица:
Table "public.test"
  Column  |   Type   | Modifiers 
----------+----------+-----------
 id       | integer  | not null
 title    | text     | 
  
Indexes:
    "test_pkey" PRIMARY KEY

в title заносится строчка слов через запятую. поиск я осуществляю конструкцией:
SELECT title FROM public.test WHERE title LIKE '%слово или фраза%';

но проблема в том что время поиска очень большое, по тестам это 1,1-1,3 секунды. смотрел в сторону индекса GIN. но так толком и не понял как им пользоваться.
пример того что мне требуется. допустим в title лежит строчка "мама, папа, я, вместе дружная семья"
человек зайдя на сайт вводит слова скажем "мама я" и ему всплывает подсказка - есть три строчки, выберите нужную.
Ответ: ^.*