MSSQL Server - FTSearch - отсечь шумные слова
-
- Уже с Приветом
- Posts: 2489
- Joined: 04 Feb 2002 10:01
- Location: Слава Україні!
MSSQL Server - FTSearch - отсечь шумные слова
Как выбросить из строки для полнотекстового поиска шумные слова, но в клиентском приложении?
Естественно, взяв текущий список этих слов.
Поскольку это должно быть быстрее и проще, чем делать это в ХП на сервере.T-SQL не очень располагает к чтению файла, разбору строки...
Естественно, взяв текущий список этих слов.
Поскольку это должно быть быстрее и проще, чем делать это в ХП на сервере.T-SQL не очень располагает к чтению файла, разбору строки...
-
- Уже с Приветом
- Posts: 1513
- Joined: 03 Apr 2001 09:01
- Location: London, UK
Re: MSSQL Server - FTSearch - отсечь шумные слова
Win32nipuh wrote:Как выбросить из строки для полнотекстового поиска шумные слова, но в клиентском приложении?
Естественно, взяв текущий список этих слов.
Поскольку это должно быть быстрее и проще, чем делать это в ХП на сервере.T-SQL не очень располагает к чтению файла, разбору строки...
А разве MS Search, использумый SQL Server'ом, не игнорирует шумные слова сам по себе - автоматически? Зачем их выбрасывать?
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
Noise-word lists for many languages are provided in the directory \Mssql\Ftdata\Sqlserver\Config. This directory is created, and the noise-word files are installed when you set up Microsoft® SQL Server™ with the full-text search support. The noise-word files can be edited. For example, system administrators at high-tech companies might add the word computer to their noise-word list. (If you edit a noise-word file, you must repopulate the full-text catalogs before the changes will take effect.) The table shows the noise-word files and their respective languages.
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 1513
- Joined: 03 Apr 2001 09:01
- Location: London, UK
-
- Уже с Приветом
- Posts: 2489
- Joined: 04 Feb 2002 10:01
- Location: Слава Україні!
Dmitry67 wrote:Noise-word lists for many languages are provided in the directory \Mssql\Ftdata\Sqlserver\Config. This directory is created, and the noise-word files are installed when you set up Microsoft® SQL Server™ with the full-text search support. The noise-word files can be edited. For example, system administrators at high-tech companies might add the word computer to their noise-word list. (If you edit a noise-word file, you must repopulate the full-text catalogs before the changes will take effect.) The table shows the noise-word files and their respective languages.
Это то ясно. Проблема в том, о чем спросил уважаемый chepakav.
Если юзер указал в строке для поиска хотя бы одно шумное слово, то
1.результат будет пустой
2.юзер так и не поймет - почему
Так что - хотелось бы отсечь на клиенте.
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
If a noise word is used in a single word search, SQL Server returns an error message indicating that only noise words are present in the query.
When you use CONTAINS, remember SQL Server discards noise words from the search criteria
Таким образом ошибка возникает если в запросе ТОЛЬКО noise words
Если и те и те - SQL автоматически уберет noise words
На клиенте делать ничего не нужно
When you use CONTAINS, remember SQL Server discards noise words from the search criteria
Таким образом ошибка возникает если в запросе ТОЛЬКО noise words
Если и те и те - SQL автоматически уберет noise words
На клиенте делать ничего не нужно
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 2489
- Joined: 04 Feb 2002 10:01
- Location: Слава Україні!
Dmitry67 wrote:If a noise word is used in a single word search, SQL Server returns an error message indicating that only noise words are present in the query.
When you use CONTAINS, remember SQL Server discards noise words from the search criteria
Таким образом ошибка возникает если в запросе ТОЛЬКО noise words
Если и те и те - SQL автоматически уберет noise words
На клиенте делать ничего не нужно
Вы не правы, или точнее, Microsoft не все описывает.
Если в запросе участвует такая комбинация "шумовое" and "нешумовое", то результатом будет ошибка:
Server: Msg 7619, Level 16, State 1, Line 1
Execution of a full-text operation failed. A clause of the query contained only ignored words.
-
- Уже с Приветом
- Posts: 5552
- Joined: 20 Mar 2001 10:01
- Location: SFBA
Win32nipuh wrote:Если в запросе участвует такая комбинация "шумовое" and "нешумовое", то результатом будет ошибка:
Server: Msg 7619, Level 16, State 1, Line 1
Execution of a full-text operation failed. A clause of the query contained only ignored words.
Не обязательно. И вообще, можете даже с синтаксическими ошибками запрос подсовывать. Если его оптимизатор соптимизирует нафиг и выкинет лишние CONTAINS/FREETEXT - сообщения об ошибке не будет.
Размер строки мы вроде бы 4000 символов ограничиваем, но парсер там совершенно ублюдочный и у нас, и у MS Search. Так что реально может меньше получиться в зависимости от запроса.
А ваш самый первый вопрос в начале темы я так и не понял.
По поводу наезда на отсутствующую документации я заранее соглашусь про неважное качество, но все же для данного конкретного случая вот цитата из BOL, что ставится вместе с SQL 2000:
"You also may encounter Error 7619, "The query contained only ignored words" when using any of the full-text predicates in a full-text query, such as CONTAINS(pr_info, 'between AND king'). The word "between" is an ignored or noise word and the full-text query parser considers this an error, even with an OR clause. "
По сути, конечно, лживое утверждение, но, тем не менее, в документации присутствует.
Увидев друга, Портос вскрикнул от радости...
-
- Уже с Приветом
- Posts: 2489
- Joined: 04 Feb 2002 10:01
- Location: Слава Україні!
...
2 8K:
1. Наезда никакого не было, не нужно преувеличивать
2. Самый первый вопрос означал следующее:
Вначале я не думал вообще ханиматься разборками строки на клиенте, ну ошибка и ошибка.Но сопле того, как юзер начал жаловаться на то, что мол, я даю фразу, а "оно" не находит, пришлось задуматься.
По крайней мере, не выбросить, а хотя бы указать юхеру на присутствие шумных слов в запросе, чтобы его насторожило. Проблему практически рещил так: сделал хранимую процедуру, которая определяет испоьзуемый язык, имя файла с шумными словами и передает клиенту, а он проходит по списку и сравнивает слова.
В большинстве случаев объем списка шумных слов небольшой, за исключением немецкого.Хотя с ним тоже придется иметь дело.
1. Наезда никакого не было, не нужно преувеличивать
2. Самый первый вопрос означал следующее:
Вначале я не думал вообще ханиматься разборками строки на клиенте, ну ошибка и ошибка.Но сопле того, как юзер начал жаловаться на то, что мол, я даю фразу, а "оно" не находит, пришлось задуматься.
По крайней мере, не выбросить, а хотя бы указать юхеру на присутствие шумных слов в запросе, чтобы его насторожило. Проблему практически рещил так: сделал хранимую процедуру, которая определяет испоьзуемый язык, имя файла с шумными словами и передает клиенту, а он проходит по списку и сравнивает слова.
В большинстве случаев объем списка шумных слов небольшой, за исключением немецкого.Хотя с ним тоже придется иметь дело.
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
-
- Уже с Приветом
- Posts: 2489
- Joined: 04 Feb 2002 10:01
- Location: Слава Україні!
%-)
Dmitry67 wrote:А в процедура найти слова слабО ?
Не слабО, конечно. Нужно хотя бы грубо определить является слово шумным или нет, и сказать юзеру.
Потому, устраивать разбор строки в процедуре мне кажется не совсем удобно. Не хватает средств, в С++, на клиенте проще.
Дело усложняется еще итем, что входную строку от юзера нужно преобразовать и только потом передать для поиска, например:
"green frog or monkey" должна быть преобразована в
FORMSOF(INFLECTIONAL,"green") and FORMSOF(INFLECTIONAL,"frog") or FORMSOF(INFLECTIONAL,"monkey")
Так раз все равно нужно делать разбор исходнй строки на лексемы на клиенте, можно и на шумные слова проверить.
Кстати, еще один интересный вопрос: как в хранимой процедуре пройтись по реестру сервера и поределить какой язык и какой для него файл используется?
Только ли через недокументированные майкрософтовские процедуры?
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
Вот уж современные программисты ! C++ им подавай
Раньше разбор строки делали на фортране и не жужжали
Я понимаю что на C++ удобнее, но можно пересилисть себя и написать пять строчек на TSQL
Чтение из registry я делаю например так
А вот прочитать произвольный файл с сервера можно только недокументированным способом который открыл я случайно:
Раньше разбор строки делали на фортране и не жужжали
Я понимаю что на C++ удобнее, но можно пересилисть себя и написать пять строчек на TSQL
Чтение из registry я делаю например так
Code: Select all
-- read registry
create table #v (value varchar(10), data varchar(255))
insert into #v (value,data)
exec master.dbo.xp_instance_regenumvalues
N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Dir\Subdir'
А вот прочитать произвольный файл с сервера можно только недокументированным способом который открыл я случайно:
Code: Select all
create table #log (str varchar(1024), cont int, n int identity)
insert into #log (str,cont)
exec master.dbo.xp_readerrorlog 1, 'c:\config.sys'
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 2489
- Joined: 04 Feb 2002 10:01
- Location: Слава Україні!
Кул!
Dmitry67 wrote:Вот уж современные программисты ! C++ им подавай
Раньше разбор строки делали на фортране и не жужжали
Я понимаю что на C++ удобнее, но можно пересилисть себя и написать пять строчек на TSQL
Чтение из registry я делаю например такCode: Select all
-- read registry
create table #v (value varchar(10), data varchar(255))
insert into #v (value,data)
exec master.dbo.xp_instance_regenumvalues
N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Dir\Subdir'
А вот прочитать произвольный файл с сервера можно только недокументированным способом который открыл я случайно:Code: Select all
create table #log (str varchar(1024), cont int, n int identity)
insert into #log (str,cont)
exec master.dbo.xp_readerrorlog 1, 'c:\config.sys'
Я помню те времена, тоже разбирал строки на фортране 4, а 77 был просто мечтой.
За способ чтения файла - спасибо. Интересное решение.
Я делаю так, тоже вариант:
exec @RC = [master].[dbo].[sp_MSget_file_existence] @noisefile, @exists OUTPUT
if @exists=1
begin
EXEC('BULK INSERT #noisewords FROM '''+@noisefile+'''')
end