Суббота, 18.05.2024
Мой сайт
Меню сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » 2017 » Октябрь » 25 » Полнотекстовый поиск SQL Server-а
19:50
Полнотекстовый поиск SQL Server-а

Полнотекстовый поиск 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 строку и он как-то это сразу ищет ориентируясь по всем имеющимся индексам.
Так что и тут есть инструмент позволяющий дать те же возможности. У него даже свои плюсы есть.

Просмотров: 400 | Добавил: akostina76 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа
Поиск
Календарь
«  Октябрь 2017  »
ПнВтСрЧтПтСбВс
      1
2345678
9101112131415
16171819202122
23242526272829
3031
Архив записей
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Copyright MyCorp © 2024
    Бесплатный конструктор сайтов - uCoz