Полнотекстовый поиск SQL Server-а
Самое ценное что есть в «Медицинской базе» это возможность полнотекстового поиска, т.е поиска любой формы слова, синонимов и т.д.
У SQL Server-а тоже есть этот инструмент. Только чтобы его использовать надо скачать расширенную версию. Для 2008 версии это SQLEXPRADV_x86_ENU.exe который можно взять например здесь:
https://download.microsoft.com/download/9/7/6/9761DF25-CBD8-4D48-9415-065F6BD4E63D/SQLEXPRADV_x86_ENU.exe
Единственный «удар в бубен», который потребовался мне это вот эта галка:
Создание полнотекстового индекса для таблицы с длинными цитатами:
CREATE FULLTEXT INDEX ON dbo._Reference80
(
_Description
Language 1049,
_Fld81
Language 1049
)
KEY INDEX PK___Referen__AC8ED0C429AC2CE0
ON ft;
… для полей «наименование» и «текст-HTML-содержание».
Сразу можно попробовать чего он найдёт в русском (код языка 1049) тексте:
SELECT _IDRRef,_Description
FROM dbo._Reference80
WHERE 1=1 AND
CONTAINS(_Description, 'FORMSOF(INFLECTIONAL,хронический)');
Работает:
Только строка для поиска чуть сложнее. Если в 1С достаточно было написать «хронический», то тут надо написать что надо найти не конкретно слово, а все его формы.
Выражение FORMSOF:
https://docs.microsoft.com/ru-ru/sql/t-sql/queries/contains-transact-sql
… позволяет искать и синонимы через FORMSOF (THESAURUS,слово). В отличие от 1С я так и не нашла слова которые он знает как синонимы.
Не знает он что «болезнь» и «заболевание» это одно и то же, ничего не находит по такой строке:
SELECT _IDRRef,_Description,_Fld81
FROM dbo._Reference80
WHERE CONTAINS(_Fld81,
'FORMSOF(THESAURUS,болезнь) AND NOT FORMSOF(INFLECTIONAL,болезнь)');
В 1С так:
Зато здесь почти наверняка возможность добавления всех этих словарей не только декларируется но и действительно работает:
https://docs.microsoft.com/ru-ru/sql/relational-databases/search/configure-and-manage-thesaurus-files-for-full-text-search
… так что и насморк с ринитом можно добавить в специально предназначенное для этого место.
Можно вспомнить вчерашний пример выборки:
http://akostina76.ucoz.ru/blog/2017-10-24-4506
… и прицепить это поиск туда:
SELECT dbo._Reference7._Description AS Objekt,
dbo._Chrc21._Description AS [Plan],
dbo._Reference80._Description AS Znachenie
FROM dbo._Chrc21 INNER JOIN
dbo._InfoRg22 ON dbo._Chrc21._IDRRef = dbo._InfoRg22._Fld24RRef INNER JOIN
dbo._Reference7 ON dbo._InfoRg22._Fld23RRef = dbo._Reference7._IDRRef INNER JOIN
dbo._Reference80 ON dbo._InfoRg22._Fld25_RRRef = dbo._Reference80._IDRRef
WHERE dbo._Reference7._Description LIKE '%желуд%' AND
dbo._Chrc21._Description LIKE '%симп%'
AND
CONTAINS(dbo._Reference80._Fld81,
'FORMSOF(THESAURUS,кровотечение) ');
Нашлось два желудочных кровотечения:
В 1С работать формально проще, т.е надо просто запустить поиск и найдётся всё что есть. Но если мне надо совместить полнотекстовый поиск с каким-то условием то делать это надо… довольно неаккуратным способом рассчитанным на то что мощная машина справится. Здесь нет такой проблемы. Всё благополучно засовывается в одну SQL строку и он как-то это сразу ищет ориентируясь по всем имеющимся индексам.
Так что и тут есть инструмент позволяющий дать те же возможности. У него даже свои плюсы есть.
|