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

Откуда:
Сообщений: 216
Доброй ночи.
1. Чем отличается
CONTAINS
от
FREETEXT
? Доку читал,
CONTAINS
- и формы слов и тезаурус,

FREETEXT
- тоже.
FREETEXT
вроде как все сразу делает, а
CONTAINS
- нет, правильно?
2. Где можно взять готовые тезаурусы общей лексики?
3. Как при Full Text Search найти
NOT SomeThing
?
Например для
OneThing AND NOT SomeThing
предикат
CONTAINS
вычисляется, а просто для
NOT 

SomeThing
- нет, возникает исключение. Можно ли как-то это обойти без прибегания к
"все результаты MINUS 

SomeThing"
? И почему такое:
FORMSOF(INFLECTIONAL,деньги) NEAR FORMSOF(INFLECTIONAL,доход)
тоже не выполняется?
19 ноя 09, 00:16    [7948009]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
Glory
Member

Откуда:
Сообщений: 104760
1. BOL
Full-text queries using FREETEXT are less precise than those full-text queries using CONTAINS. The SQL Server full-text search engine identifies important words and phrases. No special meaning is given to any of the reserved keywords or wildcard characters that typically have meaning when specified in the <contains_search_condition> parameter of the CONTAINS predicate.

4. Что значит "взять тезаурус" ? Если язык поддерживается в FTS то его тезаурус уже есть

3. NOT FREETEXT()/ NOT CONTAINS() устроит ?
19 ноя 09, 10:38    [7948972]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
SADT
Member

Откуда:
Сообщений: 216
Спасибо за ответы, Glory!

Glory

4. Что значит "взять тезаурус" ? Если язык поддерживается в FTS то его тезаурус уже есть

Пожалуйста, Glory, поясните. У меня SQL Server 2008 Trial Rus, соответственно там должен быть тезаурус русского языка? В документации я прочел, что тезаурус - это подключаемый пользователем xml-файл, находящийся в каталоге C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\FTData\. Я не прав? Чтобы не говорить на разных языках, пример: я ищу по слову «писатель», и хочу, чтобы были найдены также и документы, в которых встречаются слова «автор» и «журналист», хотя я их не задавал явно, только как по синонимам. Без подключения своего файла тезауруса можно это сделать? Из Вашего поста я понял, что это можно сделать и без дополнительного пользовательского тезауруса. Но тогда возникает вопрос как узнать какие слова в этом тезаурусе есть, а каких нет.
19 ноя 09, 11:19    [7949288]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ну так для каждой системы слова-синонимы и слова-замены могут быть разными.
Вы ищите универсальный тезаурус ?
19 ноя 09, 11:30    [7949398]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
SADT
Member

Откуда:
Сообщений: 216
Glory
Ну так для каждой системы слова-синонимы и слова-замены могут быть разными.
Вы ищите универсальный тезаурус ?

Да, разными. Но, возможно, есть какой-то обобщенный тезаурус. Или например, взять обобщенный и какие-то термы переопределить: то что не переопределено - то берется из системного тезауруса, а что переопределено - из пользовательского.
Glory, скажите по поводу предыдущего вопроса: в этом смысле системного тезауруса в MS SQL Server 2008 нет?
19 ноя 09, 12:01    [7949700]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
Glory
Member

Откуда:
Сообщений: 104760
SADT
Glory
Ну так для каждой системы слова-синонимы и слова-замены могут быть разными.
Вы ищите универсальный тезаурус ?

Да, разными. Но, возможно, есть какой-то обобщенный тезаурус. Или например, взять обобщенный и какие-то термы переопределить: то что не переопределено - то берется из системного тезауруса, а что переопределено - из пользовательского.
Glory, скажите по поводу предыдущего вопроса: в этом смысле системного тезауруса в MS SQL Server 2008 нет?

Есть редактируемый файл, куда вы можете вписать нужные вам параметры для каждого конкретного языка. Нет никаких "системных" и "пользовательских"
19 ноя 09, 12:09    [7949783]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
SADT
Member

Откуда:
Сообщений: 216
Спасибо.
19 ноя 09, 12:19    [7949865]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
SADT
Спасибо.


1. тезаурусы можно найти в интернете, точнее словари синонимов, но - это дело неблагодарное,
из-за того, что нет точного определения синонимов....
2. в CONTAINS вы можете в частности использовать выражения в строке поиска, во FREETEXT() фраза всегд интерпретируеся как набор слов объединенных ИЛИ.

3. в CONTAINS вы можете указать использовать свловоформы или тезаурус, во FREETEXT()
слова пропускаются через тезаурус и формы.... правда там на практике есть проблемы, например, для синонимов словоформы не применяются...

и т.д.
19 ноя 09, 13:19    [7950407]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
SADT
Member

Откуда:
Сообщений: 216
Winnipuh, если мне нужно найти по слову, например, "финансы" все формы этого слова и его синонимы, например, задав их в файле тезауруса, что использовать в этом случае? Или просто передать в CONTAINS FORMSOF(INFLECTIONAL, СЛОВО1) OR FORMSOF(INFLECTIONAL, СЛОВО2) OR FORMSOF(INFLECTIONAL, СЛОВО3)... и так для всех синонимов, явно задав их в строке запроса? Что будет с производительностью для большого количества синонимов?
19 ноя 09, 13:46    [7950651]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
SADT
Winnipuh, если мне нужно найти по слову, например, "финансы" все формы этого слова и его синонимы, например, задав их в файле тезауруса, что использовать в этом случае? Или просто передать в CONTAINS FORMSOF(INFLECTIONAL, СЛОВО1) OR FORMSOF(INFLECTIONAL, СЛОВО2) OR FORMSOF(INFLECTIONAL, СЛОВО3)... и так для всех синонимов, явно задав их в строке запроса? Что будет с производительностью для большого количества синонимов?


если одно слово, то FREETEXT попробуйте, он и формы найдет, и соответствующие синонимы
А так как вы написали - тоже можно, но вы указали искать только формы слов, есть другой параметр, указывающий искать по синонимам, не помню точно, см. в БОЛе., т.е. это должны быть разные вызовы CONTAINS/

По производительности - не могу сказать ничего, я не знаю какой объем данных у вас и.т.д.
в 2008 вроде бы наконец поиск и индексирование довели более-менее до ума...
19 ноя 09, 14:05    [7950792]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
SADT
Winnipuh, если мне нужно найти по слову, например, "финансы" все формы этого слова и его синонимы, например, задав их в файле тезауруса, что использовать в этом случае? Или просто передать в CONTAINS FORMSOF(INFLECTIONAL, СЛОВО1) OR FORMSOF(INFLECTIONAL, СЛОВО2) OR FORMSOF(INFLECTIONAL, СЛОВО3)... и так для всех синонимов, явно задав их в строке запроса? Что будет с производительностью для большого количества синонимов?


для вашего примера похоже FREETEXT(*, N'word1 word2 word3')
19 ноя 09, 14:06    [7950802]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
SADT
Member

Откуда:
Сообщений: 216
Winnipuh
SADT
Winnipuh, если мне нужно найти по слову, например, "финансы" все формы этого слова и его синонимы, например, задав их в файле тезауруса, что использовать в этом случае? Или просто передать в CONTAINS FORMSOF(INFLECTIONAL, СЛОВО1) OR FORMSOF(INFLECTIONAL, СЛОВО2) OR FORMSOF(INFLECTIONAL, СЛОВО3)... и так для всех синонимов, явно задав их в строке запроса? Что будет с производительностью для большого количества синонимов?


для вашего примера похоже FREETEXT(*, N'word1 word2 word3')

Буду пробовать, спасибо)
19 ноя 09, 14:30    [7951014]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
SADT
Member

Откуда:
Сообщений: 216
Почему может не работать следующее:
SELECT Id, Name, RANK FROM Docs INNER JOIN 
CONTAINSTABLE(Docs, Doc, 'деньги  ~  FORMSOF(INFLECTIONAL,финансы)') AS KEY_TABLE 
ON (Docs.ID = KEY_TABLE.[KEY]) ORDER BY RANK DESC

т.е. ругается на это:
 CONTAINSTABLE(Docs, Doc, 'деньги  ~  FORMSOF(INFLECTIONAL,финансы)')
а
CONTAINSTABLE(Docs, Doc, 'деньги  ~  финансы')
выполняется без проблем. Не поддерживается?
20 ноя 09, 14:16    [7956689]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ругаются грузчики на рынке
А сервер выдает сообщение об ошибке
Которое надо читать
20 ноя 09, 14:18    [7956711]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
SADT
Member

Откуда:
Сообщений: 216
Кстати, абсолютное значение величины Rank имеет значение? При некоторых запросах оно равно 1000, а при некоторых максимум 40-50. Или важно только упорядочивание результатов внутри полученного множества?
20 ноя 09, 14:18    [7956717]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
SADT
Member

Откуда:
Сообщений: 216
SADT, доку надо читать:
< proximity_term > ::=
{ < simple_term > | < prefix_term > }
{ { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ]
Короче, не поддерживается.

P.S. А с RANK как дела обстоят?
20 ноя 09, 15:09    [7957109]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
Glory
Member

Откуда:
Сообщений: 104760
SADT
SADT, доку надо читать:
< proximity_term > ::=
{ < simple_term > | < prefix_term > }
{ { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ]
Короче, не поддерживается.

P.S. А с RANK как дела обстоят?

Опять читать доку ??

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. This rank value is typically used in one of these ways in the SELECT statement:
20 ноя 09, 15:11    [7957116]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы про Full Text Search  [new]
SADT
Member

Откуда:
Сообщений: 216
Glory

Опять читать доку ??

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. This rank value is typically used in one of these ways in the SELECT statement:

Glory, я имел ввиду несколько другое: является ли Rank абсолютным показателем релевантности? Если в запросе №1 у нас max(Rank) = 500, а в запросе №2 max(Rank) = 200, значит ли это, что в первом запросе получены более релевантные результаты? Само собой, считая, что мы просто по-разному сформулировали условие поиска, а искали примерно одно и то же. Или это только критерий упорядочивания ВНУТРИ результатов поиска?
20 ноя 09, 18:33    [7958489]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить