2010-09-02 15 views
1

Я раздобыл SQL Server 2008 Developer Edition и это мои данные:полнотекстового поиска SQL Server 2005

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-мир, избегая LIKE для соображений эффективности.

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

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

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

Спасибо.

Christian

PS:

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

ответ

1

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

  • SELECT * FROM тест
    WHERE
    данные LIKE '% мирового%'
    • --results в
      - Привет мир!
  • SELECT * FROM тест
    WHERE
    данные LIKE '% J-мировой%'
    • --results в
      --Hello J-мире!

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

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

В SSMS Базы данных \ имя_базы_данных \ Storage \ полнотекстового Stoplist -> правой кнопкой мыши и выберите "New полнотекстового StopList ...". Я назвал его vgvStoplist и удостоверился, что по умолчанию установлен флажок «Создать пустой syoplist».

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

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

выберите * из теста где содержит (данные, 'J-мир "') только

возвращает«H ello j-world '(без «Hello world»)

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

MSDN

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

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

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

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

  • (*) отдельный скрипт из системы stoplist
    путем создания еще одного полнотекстового StopList маркировки его с «Создать из системы stoplist» тогда скрипта («Файл ...»или„New Query Editor Window“),

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

(**) Вот отрывок из сценария копии, названный мною как 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
Я отправил подвопрос Performace gains of searching with FTS over it with LIKE on indexed colum(s)?

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

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

Я считаю, что вам следует опубликовать его как отдельный вопрос. Я уже несколько раз был заблокирован на сайтах StackExchange (и все еще в SF) для обсуждения. Это не форум или дискуссия, ср. ВОПРОСЫ-ОТВЕТЫ.

+2

Так вы изложили все остальные ответы из-за этого? На самом деле ваш ответ должен был быть размещен здесь в «оригинальной» теме, а другой пост должен быть помечен как дубликат. – Matt

+0

Я закрыл дубликат, поэтому, пожалуйста, отредактируйте это с текстом вашего реального ответа. –

+0

Спасибо, что звучит интересно. Я посмотрю на это. Из-за эффективности я не рассматривал решение «LIKE». Мне приходится иметь дело с миллионами текстов и миллионами ключевых слов. Благодарю. – cs0815

0

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

+0

Я попробовал, и он получил тот же результат – cs0815

-1

не имеют FTS с поддержкой БД создана для тестирования, но есть вы пытались что-то вроде сложения (данные, «мир И НЕ» - мир »)? Возможно, вам придется изучить модификацию словосочетания.

+0

Я предполагаю, что это сработает, но я не мог сделать это ни для какой возможности, если вы знаете, что я имею в виду. В конце дня я хотел бы проиндексировать некоторый текст против нескольких слов TOUS и EXCACT. Пока полнотекстовый поиск кажется бесполезным даже для таких простых задач ... – cs0815

+0

Я не знаю, о чем думал. Добавление NOT, вероятно, не будет иметь никакого эффекта, и вам почти наверняка нужно будет изучить модификацию слова ... SQL Server рассматривает «j-world» как два разных слова «j» и «world». Таким образом, вы получаете точное соответствие по «миру». Ссылка MS: http://support.microsoft.com/kb/200043, а кто-то другой пытается сделать примерно одно и то же: http://stackoverflow.com/questions/1542708/how-to-change-word-break-characters -in-sql-server-full-text-indexing – joelt

Смежные вопросы