Как выполнить поиск с широким соответствием с помощью поиска TSQL FreeText с числовыми значениями? - PullRequest
0 голосов
/ 21 июня 2011

Я пытаюсь выполнить свободный текстовый поиск по таким терминам, как «номер модели Sony np-fx110» или «чехол для sony sz-vgn770N» или «модель ноутбука Asus g60v».

Я знаю, что свободный текст обрабатывает числа как шум, поэтому я решил, что отредактирую числа из файла noiseENU.txt для SQL Server 2008, но не могу найти файлы шума на моем сервере.

Каталог FTData содержит только несколько файлов XML размером 2 КБ и пустую папку FilterData.

У меня есть функция split, которая будет возвращать все слова в заданной строке с разделенным символом пробела. Мне нужен CTE, который объединит текст AND для каждого слова, возвращаемого функцией SPLIT ().

> SELECT *  FROM MyTable WHERE
> Description LIKE '%asus%'  AND
> Description LIKE '%laptop%'  AND
> Description LIKE '%model%'  AND
> Description LIKE '%g60v%'

По существу, номер модели может быть где угодно в поле описания. Я легко могу сделать LIKE [номер модели], однако я бы хотел сопоставить это с другими словами, содержащимися в описании.

Это не похоже на оптимальный подход, но выполнимо. Буду признателен за любые другие предложения о том, как решить эту проблему.

Спасибо.

UPDATE

Вот результат запуска "exec sp_help_fulltext_catalogs"

> ftcatid:5 NAME: CTIMytemDataCatalog   
> PATH: NULL                            
> STATUS: 0 
> NUMBER_FULLTEXT_TABLES: 1

UPDATE

Проблема возникает, когда номер модели представляет собой просто число, например «4» в «iphone 4».

Я уже динамически создаю запрос CONTAINS, вставляя AND между каждым термином. Тем не менее, вот некоторые проблемы:

> **WHERE CONTAINS(*, 'iphone AND 4 AND battery')** - returns 0 results
> **WHERE FREETEXT(*, 'iphone 4 battery')** - is matching for iphone
> OR battery which is sub-optimal
> **WHERE CONTAINS(*, '"iphone 4" AND "battery"')** - returns the most
> accurate result set

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

Есть предложения по этому подходу?

1 Ответ

1 голос
/ 21 июня 2011

Вы пытались использовать полнотекстовый индекс?

Вы правы, что SQL по умолчанию воспринимает "1" или "2" как шум (вы можете изменить это) ... но он не должен найти "g60v" или "sz-vgn770N".Я использовал FTS аналогичным образом, просматривая каталог книг ISBN, и он работал нормально.

Наконец, я могу ошибаться в этом ... но я не думаю, что файл шума создается, пока выфактически строит / использует FTS.

Также обратите внимание, что поиск FTS не похож на использование оператора like. Ознакомьтесь с различными методами для поиска FTS с помощью Books Online, если вы не знакомы с синтаксисом.

Такой запрос должен работать для ваших нужд: (как я использую FTS споиск по каталогу моей книги)

WHERE FREETEXT (*, 'g60v asus laptop model' );

Подробнее о запросах свободного текста здесь: http://msdn.microsoft.com/en-us/library/ms176078.aspx

...