2010-01-22 3 views
0

Я изучил встроенный полнотекстовый поиск SQL 2008, а также Lucene.NET .. но я не думаю, что они будут делать то, что мне нужно. И я просто хочу убедиться, что я строю свою программу как можно эффективнее.Лучший способ частичного поиска в SQL 2008

Итак, вот сон. Я хочу иметь одно текстовое поле на странице (например, google) и разрешать пользователю вводить НИЧЕГО. И на основе их текста я буду искать 10 таблиц, чтобы найти то, что они ищут.

Пример. Моя база данных содержит тысячи мест, каждая из которых имеет несколько имен/кодов. В каждом месте есть тонны данных, связанных с ними.

Так что если пользователь хочет отобразить все местоположения с кодами, которые содержат «VM» («CD-VM01», «CD-VM02», «CD-VM03» и т. Д.), Они должны иметь возможность , Или, если они хотят найти все места в Торонто, они просто набирают Торонто. Я хочу сделать поиск максимально простым для людей. (Я обнаружил, что людям не нравится думать).

Плюс это становится проще масштабировать до большего количества параметров поиска, если я могу просто искать базу данных и не добавлять новые поля на экран поиска ,

Так что если я не использую полнотекстовый поиск (который я не могу для частичного), единственное, что я вижу, что я остался с «Like» .. это правильно? это мой единственный вариант?

ответ

0

Похоже, что самым простым и быстрым решением этой проблемы будет использование LIKE.

0

Я думаю, вопрос в том, даже если бы вы смогли сделать это в базе данных, как бы вы справились с ним в пользовательском интерфейсе?

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

В поле поиска Google нужно искать только одно - содержимое веб-страниц - и возвращать один тип результата - URL-адреса веб-страниц и выдержки. В основном вы пытаетесь найти много разных вещей, и вам, скорее всего, придется обрабатывать каждый случай отдельно.

В качестве альтернативы вы можете сохранить денормализованную таблицу поиска, которая содержит только текст поиска и общие атрибуты, которые, по вашему мнению, должны отображаться при каждом нажатии. Поддерживайте его либо с запланированной задачей, либо с помощью триггеров. Вы также сможете использовать FTS.

Update

Некоторые из комментариев выражают некоторую неопределенность относительно того, что SQL Server Full-Text Search способен. FTS может наиболее определенно искать одну строку в любом месте текста столбца, а также делать другие вещи (поиск близости, поиск в свободном тексте и т. Д.). Если вы только начинаете, я бы рекомендовал TechNet страниц на эту тему, документация является очень всеобъемлющей.

В частности, я хотел бы предложить, имея взгляд на раздел о Configuring Catalogs и Getting Started страницу (Notes Коула: вы должны создать каталоги - написание запросов CONTAINS без них не будет вам очень далеко). Затем взгляните на страницу querying. Я был бы очень удивлен, если вы не сможете найти ответы на любые ваши вопросы.

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

+0

Я вижу, что вы говорите, и, подумав об этом, я понимаю, что теряю время пользователя, если я ищу то, что им не интересно. пример: пользователь вводит в «0008», который им это частичный код сайта, но я бы не знал разницы, и я мог найти серийные номера, ссылочные номера и т. д. Я полагаю, что у меня может быть динамический список параметров, которые они могут искать, и все в порядке. Но я обнаружил, что FTS не поможет мне с частичным поиском. Если пользователь хочет показать все коды, содержащие «VM000» в таких кодах, как (CMVM0001, CMVM0002, CMVM0003), я хочу, чтобы они это делали – Dan

+0

@ Dan: Я признаюсь, что не уверен, что именно вы имеете в виду, когда говорите что FTS не может выполнить частичный поиск в соответствии с вашим примером. Разве это не то, что делают ключевые слова 'CONTAINS' и' FREETEXT'? – Aaronaught

+0

Глядя на это: http://en.wikipedia.org/wiki/SQL_Server_Full_Text_Search и из моих исследований FTS может выполнять только «Префиксные поисковые запросы», а не поиск в середине слов. – Dan

0

Я считаю, что Lucene делает именно то, что вы ищете.Вы можете добавить индекс из любого внешнего источника данных (включая несколько таблиц базы данных), затем запросить этот индекс, и вы вернете указатели на соответствующие записи.

Недостатком является то, что в отличие от полнотекстового индексирования вы несете ответственность за создание и поддержание индекса самостоятельно.

Вы можете увидеть an example of how Lucene.NET might be used.

+0

hmm .. Знаете ли вы о каких-либо конкретных сайтах, которые говорят об этом напрямую. Трудно найти ТОЧНУЮ информацию, которую я ищу. Мне бы очень хотелось начать работать над этим, просто чтобы узнать, что он делает то же самое, что и FTS. – Dan

+0

, даже глядя на это: http://lucene.apache.org/java/2_2_0/queryparsersyntax.html говорится: «Вы не можете использовать символ * или? Как первый символ поиска», который подразумевал бы, что если бы я хотел найти «CMVM0008» Я не смог найти «VM0008» – Dan

+0

Я был удивлен, что там не было куча примеров, когда я искал материал. Добавлена ​​ссылка для ответа. –

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