2010-04-09 4 views
0

Многие поисковые системы имеют функциональность «вы имели в виду».сходство

Существует простой способ использования (N) спящего режима (например, ICriteria) для поиска объекта (например, ключевого слова) на основе сходства. Обратите внимание, что я не имею в виду Expression.Like или что-то вроде этого.

Надеюсь, этот вопрос имеет смысл.

Спасибо.

Christian

PS:

сходство означает, что в моем случае (скажем) 70% символов общего.

I предполагается реализовать метод расширения под названием бла, который я могу использовать для моих критериев запросов:

ICriteria Критерии = Session.CreateCriteria (TypeOf (ххх)); Criteria.Add (Expression.bla («имя», имя)); return Criteria.List() as List;

+0

Я знаю только, что это называется «Нечеткий поиск» - в SSIS есть аналогичная функциональность, которую я использовал в прошлом. –

+0

Когда я говорю о сходстве, я имею в виду общие черты - не чувствительный к регистру. Спасибо, Павел, что звучит интересно, привяжет его к серверу sql. Для реализации Expression.InsensitiveLike использует (n) hibernate использование «стандартной базы данных ansi»? – cs0815

ответ

2

Это не доступно для nHibenate. nHibernate - это уровень доступа к данным, он может делать только то, что делает база данных. Вы должны сами определять сходства, возможно, поддерживая таблицу общих ошибок. Это то, что поисковые системы все равно делают, они не просто волшебным образом определяют, что такое опечатка.

+0

> Это то, что делают поисковые системы, они не просто волшебным образом определяют, что такое опечатка. Не уверен, хранят ли они эту информацию в db - я скорее думаю, что они используют алгоритм - как общие символы или что-то – cs0815

+0

Оба. Они должны знать наверняка, что опечатка - это не какое-то имя. Но у вас могут быть разные критерии «подобия». –

+0

Поддержание таблицы общих ошибок - это НАДЕЖНАЯ идея! Не делай этого! –

1

Hibernate не сделает вашу базу данных более умной, чем она есть. «Вы имели в виду» - очень сложный бизнес; он обычно реализуется путем статистического анализа слов и n-граммов (многословных последовательностей) против метаданных структур индекса инвертированных файлов поисковой системы и журналов запросов.

В качестве примера, если я нахожу exmaple code, двигатель может выполнять сканирование наиболее распространенных известных слов в корпусе, вычисляя расстояние редактирования каждого слова от термина exmaple. Вероятно, он найдет example и, таким образом, предложит: «Возможно, вы имели в виду example code».

0

Сходство трудно определить, и ИМХО определяется по-разному во многих случаях использования. Схожесть может быть фонетически (существуют разные алгоритмы, такие как Köllner Verfahren для Германии). В случае фонетически сходства это функция, которая вычисляет строковое представление. Тогда для сравнения их можно использовать расстояние Левенштейна. Я мало знаю о (N) Hibernate, но метод расширения можно использовать для вычисления сравнения по объектной базе.

-sa

+0

Метод расширения - это то, что я искал. я предусмотрел, что я реализую метод расширения, называемый bla, который я могу использовать для своих критериев запросов: ICriteria Criteria = Session.CreateCriteria (typeof (xxx)); Criteria.Add (Expression.bla («имя», имя)); return Criteria.List () as Список ; – cs0815

0

Я не думаю, что NHibernate имеет функциональность, которая по своей сути предоставляет вам подобные слова.

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

Эта функция расстояния является ключевым, и вы можете иметь много критериев, на основании которых вы вычислить расстояние между словами

+0

Привет, Могу ли я каким-то образом реализовать это с помощью ICriteria. Я уверен, что смогу реализовать интерфейс или что-то, чтобы подсчитать количество общих символов, которые затем могут быть использованы каким-то образом. C# (3.5) имеет специальное имя для методов, которые могут появляться, если вы используете Expression.Bla. Надеюсь, это имеет смысл. Я понимаю, что NHIbernate - технология доступа к данным, но я также видел, что она интегрируется с Lucene - на самом деле есть книга по поиску с спящим режимом. – cs0815

2

Вы можете использовать функцию SOUNDEX в SQL

SELECT 
    * 
FROM 
    Products 
WHERE 
    SOUNDEX(ProductName) = SOUNDEX('beer') 

Это будет возвращать продукты, имеют имена, похожие на «пиво».

UPDATE:

SELECT 
    * 
FROM 
    Products 
WHERE 
    DIFFERENCE(ProductName, 'beer') IN (3, 4) 

Это также возвратить продукты с похожими названиями ...

-Pavel

+0

Интересно - просто попробовал, и результат выглядел нормально. Является ли это стандартным UDF ansi? – cs0815

+0

Для SOUNDEX: недостатком всех фонетических алгоритмов является то, что они фокусируются на определенном языке (soundex english). Köllner Verfahren был разработан для Германии и т. Д. Во-вторых: похоже, это не означает точно такой же выход функции, поэтому, вероятно, вы также должны иметь дистанцию ​​для результата soundex. – Sascha

2

Как другие говорили, это вообще выходит за рамки РСУБД. Используйте Lucene.Net (возможно, через NHibenate.Search) или Solr (возможно, через SolrNet). Solr даже поставляется с spell checking из коробки, которую вы можете использовать, чтобы легко реализовать функциональность «вы имели в виду».

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