Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 fulltext и mssql 2000  [new]
Ora Starter
Member

Откуда: Киев
Сообщений: 587
Гуру, вопрос. Есть серввак mssql 2000 sp4.
Есть структура таблиц:
Основные данные
create table t1 (
id int,
f1 nvarchar(250),
f2 nvarchar(250),
f3 nvarchar(250),
f4 nvarchar(250)
)
Дополнительная таблица 1(дополняет значения для поля f2)
create table t2 (
id int,
f2 nvarchar(250),
t1_id int
)
Дополнительная таблица 2(дополняет значения для поля f3)
create table t3 (
id int,
f3 nvarchar(250),
t1_id int
)

На каждой таблице включен полнотекстовый поиск по текстовым полям. Необходимо выбрать одним запросом сначала все записи, которые удовлетворяют условию полностью, а потом частично. Условие вводит пользователь: строка поиска. Ввести он может любую комбинацию слов. Возмем простую: слово1 и слово2. Без таблиц t2 и t3 время работы запроса еще куда не шло:
select *
from t1
where (contains(f1, ' "слово1" AND NOT "слово2" ')
and contains(f2, ' "слово2" AND NOT "слово1" '))
or
(contains(f1, ' "слово1" AND NOT "слово2" ')
and contains(f3, ' "слово2" AND NOT "слово1" '))
or
(contains(f1, ' "слово1" AND NOT "слово2" ')
and contains(f4, ' "слово2" AND NOT "слово1" '))
or
(contains(f2, ' "слово1" AND NOT "слово2" ')
and contains(f3, ' "слово2" AND NOT "слово1" '))
or
(contains(f2, ' "слово1" AND NOT "слово2" ')
and contains(f4, ' "слово2" AND NOT "слово1" '))
or
(contains(f3, ' "слово1" AND NOT "слово2" ')
and contains(f4, ' "слово2" AND NOT "слово1" '))
or

(contains(f1, ' "слово2" AND NOT "слово1" ')
and contains(f2, ' "слово1" AND NOT "слово2" '))
--- И так далее
union all
select *
from t1
where contains(*, '"слово1" OR "слово2"')
and not contains(*, '"слово1" AND "слово2"')
И это еще без таблиц t2 и t3. Можно как-то упростить первый union? Или тут необходимо как-то денормализировать структуру таблиц?
Спасибо
7 дек 09, 10:31    [8026751]     Ответить | Цитировать Сообщить модератору
 Re: fulltext и mssql 2000  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
в первых строках хотелось бы узнать:
у вас на "mssql 2000 sp4." работает русский язык в полнотекстовом поиске?
7 дек 09, 12:07    [8027681]     Ответить | Цитировать Сообщить модератору
 Re: fulltext и mssql 2000  [new]
Ora Starter
Member

Откуда: Киев
Сообщений: 587
Winnipuh
в первых строках хотелось бы узнать:
у вас на "mssql 2000 sp4." работает русский язык в полнотекстовом поиске?

Нет конечно. Это только пример - псевдо код так сказать.
Я не сильно знаком с fulltext, может как-то проще можно запрос? Или все-таки денормализация?
7 дек 09, 12:24    [8027846]     Ответить | Цитировать Сообщить модератору
 Re: fulltext и mssql 2000  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Ora Starter
Winnipuh
в первых строках хотелось бы узнать:
у вас на "mssql 2000 sp4." работает русский язык в полнотекстовом поиске?

Нет конечно. Это только пример - псевдо код так сказать.
Я не сильно знаком с fulltext, может как-то проще можно запрос? Или все-таки денормализация?


"Необходимо выбрать одним запросом сначала все записи, которые удовлетворяют условию полностью, а потом частично. "

вы подумайте, и возможно все намного проще ,типа такого:

select *
from t1
where contains(f1, ' "слово1" OR "слово2" ')
7 дек 09, 13:22    [8028346]     Ответить | Цитировать Сообщить модератору
 Re: fulltext и mssql 2000  [new]
Ora Starter
Member

Откуда: Киев
Сообщений: 587
Winnipuh,

ну и результаты будут в перемешку, и те в которых в поле f1 будут эти слова вместе и те в которых или слово1 или слово2... что не верно.
7 дек 09, 14:38    [8029245]     Ответить | Цитировать Сообщить модератору
 Re: fulltext и mssql 2000  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ora Starter
Winnipuh,

ну и результаты будут в перемешку, и те в которых в поле f1 будут эти слова вместе и те в которых или слово1 или слово2... что не верно.

Может подойдет
The table produced by CONTAINSTABLE includes a column named RANK. The RANK column is a value (from 0 through 1000) for each row indicating how well a row matched the selection criteria.
7 дек 09, 14:49    [8029343]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить