полнотекстовый поиск sql server 2005 - PullRequest
1 голос
/ 02 сентября 2010

У меня есть версия для разработчиков sql server 2008, и это мои данные:

 if exists (select * from dbo.sysobjects where id = object_id(N'test') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table test
    create table test
    (
    Id INT IDENTITY NOT NULL primary key,
    data NVARCHAR(255) not null
    )

    insert into test (data) values ('Hello world');
    insert into test (data) values ('Hello j-world');

Я хотел бы найти все строки, содержащие j-world, избегая LIKE по соображениям эффективности.

Если я попытаюсь:

select 
    * 
from test
where freetext
(
    *,
    N'j-world'
);

Я получу все строки, что неверно.Должен ли я реализовать свой собственный инструмент разбиения по словам или что-то?Могу ли я вообще использовать iFTS в этой ситуации?

Спасибо.

Кристиан

PS:

Позвольте мне сформулировать мой вопрос более обобщенно.Как я могу найти дефисные слова, используя FTS (j-world - просто пример)?

Ответы [ 4 ]

1 голос
/ 29 сентября 2010

Я не совсем понимаю, зачем вам FTS? Если вам нужен точный марш, это делается просто с помощью LIKE:

  • ВЫБРАТЬ * ОТ теста
    ГДЕ
    данные, как "% мира%"
    • - результат в
      --Привет, мир!
  • ВЫБРАТЬ * ОТ теста
    ГДЕ
    данные, как "% j-мир%"
    • - результат в
      - Привет, J-мир!

Если вы хотите играть с FTS. Создайте и задействуйте свой собственный (настраиваемый) полнотекстовый стоп-лист

  • У меня нет SQL Server 2005, но я проверил, что он работает в 2008 году.
    Документы говорят, что это возможно только для уровня совместимости 100 (то есть в SQL Server 2008).
    Хотя попробуйте в 2005

В базе данных SSMS \ YourDatabaseName \ Storage \ Full Text Stoplist -> щелкните правой кнопкой мыши и выберите «New Full-text StopList ...». Я назвал его vgvStoplist и убедился, что по умолчанию выбрана радиокнопка «Создать пустой список».

В SSMS щелкните правой кнопкой мыши таблицу dbo.test ---> Полнотекстовый индекс -> Свойства ---> Выберите страницу: Общие, Стоплист полнотекстового индекса -> введите имя созданного пустого списка (I введено vgvStoplist )

Теперь запрос

выбрать * из теста где содержит (данные, «j-мир»)

возвращает только «Hello j-world» (без «Hello world»)

Это также можно сделать через TSQL. Следуйте MSDN


==== Обновление:
Ну, ваш вопрос показал, что понятие шума субъективно.

Это сработало, потому что «j» является системным стоп-словом (см. Поиск системного стоп-листа (*) по строке «j» (3 символа), см. Также (**)), а «-», по-видимому, является разбивателем слов.

Я не предлагал вам использовать пустой список стоп-слов. Я только что проиллюстрировал "как это сделать" с минимумом усилий с моей стороны.
Разработка техник, подходящих для вас, зависит от вас. Я даже не эксперт в этой области, чтобы давать советы. Я только что ответил вам из принципа здравого смысла

Создайте свой собственный полнотекстовый StopList, заполните его своим контентом.
Возможно, вы захотите повторно использовать содержимое системного списка остановок.
Для этого вы можете создать

  • (*) отдельный скрипт системного стоп-листа
    путем создания еще одного полнотекстового StopList с пометкой «Создать из системного стоп-листа», а затем сценария («Файл ...» или «Окно нового редактора запросов»),

затем создайте свой собственный сценарий, отредактировав копию () с помощью функции поиска и замены и / или копирования и вставки из ().

(**) Вот выдержка из скриптовой копии, названной мной как vgv_sys_copy, из системы FT StopList:

ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'French';
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Italian';
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Japanese';
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Dutch';
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Russian';
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Swedish';
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Simplified Chinese';
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'British English';

Update2
Я разместил подзапрос Производительность при поиске с FTS над ним с LIKE на индексированных столбцах?

Я также заметил, что ответил на основании функций, недоступных в SQL Server 2005
Должен быть MSSQL \ FTData \ noiseENG.txt, и мне понравились ответы на Шумовые слова в полнотекстовом поиске Sql Server 2005

Я бы удалил 'j'. На самом деле, на вашем месте я бы создал noiseENG.txt с нуля. Но это ваши решения в зависимости от вашего контекста и множества неизвестных мне факторов.

Полагаю, вы должны опубликовать это как отдельный вопрос. Меня уже несколько раз забанили на сайтах StackExchange (и до сих пор на SF) за обсуждения. Это не форум или форум, ср. FAQ.

0 голосов
/ 02 сентября 2010

FREETEXT менее точен по сравнению с СОДЕРЖИТ

http://www.mssqltips.com/tip.asp?tip=1382

СОДЕРЖИТ объяснил:

http://msdn.microsoft.com/en-us/library/ms187787.aspx

0 голосов
/ 03 сентября 2010

У меня нет настроенной БД с поддержкой FTS, но вы пробовали что-то вроде содержит (data, 'world AND NOT "-world"')?Возможно, вам придется посмотреть, как изменить разрыв слова.

0 голосов
/ 02 сентября 2010

Попробуйте использовать CONTAINS, может быть?Функции свободного текста больше похожи на «LIKE».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...