2013-04-19 2 views
-1

Я разрабатываю веб-приложение с использованием ASP.NET и SQL Server 2008. У меня около 1 000 000 статей в моей базе данных, и я активировал полнотекстовый поиск.Проверка орфографии и сценарий предложения слов в SQL Server

Теперь я хочу, чтобы найти в статьях, и мне нужно 3 функциональные возможности для поиска текстового поля:

  1. автозаполнения: когда пользователь вводит слово (Wor) Я хочу, чтобы показать ему (World, Word , ...).
  2. Сроки предложения: Когда пользователь вводит слово (мир), я хочу показать ему следующие термины (Первая мировая война, Вторая мировая война, ...).
  3. Проверка орфографии: когда пользователь вводит неправильное слово, я хочу его исправить.

Первый сценарий может быть легко реализован, как показано ниже:

SELECT TOP 10 * 
FROM sys.dm_fts_index_keywords(db_id('MyDB'), object_id('Articles')) 
WHERE display_term LIKE 'Wor%' 
ORDER BY document_count DESC 

Я не знаю, как реализовать второй сценарий. IMO Мне нужно создать таблицу (FirstWord, SecendWord, Frequency), чтобы хранить последовательности терминалов и их частоты (извлекать их из содержимого статьи) и искать по порядку первого порядка по частоте.

Для третьего сценария: я прочитал о алгоритмах проверки орфографии (ASpell, NSpell, ...), я хочу знать, что для них есть реализация SQL Server + .NET?

Есть ли решение для удовлетворения моих потребностей? Я предпочитаю реализовать их все как SP в SQL Server.

Update: Вот содержание записи, которую я должен искать:

Гитлер и Муссолини оказали большую военную и финансовую поддержку националистического восстания во главе с генералом Франсиско Франко в Испании. Советский Союз поддержал существующее правительство, Испанская Республика, которое показало левые тенденции. Более того, более 30 000 иностранных добровольцев, известных как международные бригады, сражались против Франко. И Германия, и СССР использовали эту прокси-войну как возможность испытать улучшенное оружие и тактику. Преднамеренное бомбардирование Герники немецким кондорским легионом в апреле 1937 года вызвало всеобщую обеспокоенность в связи с тем, что следующая крупная война будет включать в себя обширные террористические атаки на гражданских лиц. [30] [31] Хотя были некоторые незначительные очаги сопротивления, националистический фронт объявил победу 1 апреля 1939 года. [32] Следует отметить, что пять месяцев спустя Германия напала на Польшу, начав Вторую мировую войну.

+0

ссылка 'sql wildcards' здесь> http://www.w3schools.com/sql/sql_wildcards.asp – zey

ответ

3

Я бы рекомендовал использовать для этого поисковую систему (Lucene) SOLR. Это специально для того, чтобы делать то, о чем вы просите.Теперь SOLR требует выполнения Java (обычно с Tomcat), но если вы можете согласиться с этим, использование Solr.Net - замечательный опыт.

+0

Спасибо, поддерживают ли они упомянутые сценарии? Я ищу решение для покрытия всех трех сценариев. Вынимают ли они условия из контента? Я хочу извлечь «Мировую войну» из приведенного выше контента. Я видел некоторые SAAS, такие как OpenCalais и AlchemyApi, которые извлекают ключевые слова, теги, темы и ... из контента. Здесь мне нужны известные термины. –

+0

Все три покрыты и гораздо больше вы не просили. Представьте себе будущее требование поддержки китайцев. Нет проблем. Сам Solr использует xml через http (следовательно, веб-сервер tomcat), а его схема определена в XML-файле. С Solr.Net вы получаете хороший .NET api для создания индексов и поиска индексов. Я выполнил три успешных проекта, используя solr, и это просто великолепно. Я очень рекомендую. –

+0

Ранжирование и повышение - это то, что вы, вероятно, хотите. Думаю, вам тоже нужны гранулы. –

0

Ваш запрос будет работать и для второго сценария. Для 3-первых, вы можете использовать ваши письма по одному имеющему дикие символы между ними так, ваше где оператор может выглядеть следующим образом:

WHERE display_term LIKE 'W_o_r%' 
+0

Ответ может быть« Woodrow »или« Woodridge »(что неверно). :) –

0

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

SELECT TOP 10 * 
FROM sys.dm_fts_index_keywords(db_id('MyDB'), object_id('Articles')) 
WHERE display_term LIKE 'Wor %' 
ORDER BY document_count DESC 

просто положил пробел после слова и знак%.

+0

Спасибо, но когда пользователь набирает «Wor», приемлемым результатом является «Мировая война». –

1

Есть несколько реализаций расстояния Хэмминга в .net, которые вы могли бы вышка в приложение, чтобы сделать сценарий 3.

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

0

Вы можете изучить AmisaDB, который мы используем. Описывает все три сценария, которые вы упоминаете, используя простые встроенные функции sql.

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