совпадение совпадений - PullRequest
       8

совпадение совпадений

0 голосов
/ 09 апреля 2010

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

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

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

Спасибо.

Christian

PS:

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

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

Критерии ICriteria = Session.CreateCriteria (typeof (xxx)); Criteria.Add (Expression.bla ("имя", имя)); вернуть Criteria.List () в виде списка;

Ответы [ 6 ]

2 голосов
/ 09 апреля 2010

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

2 голосов
/ 09 апреля 2010

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

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

Это вернет продукты, названия которых похожи на «пиво».

UPDATE:

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

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

-Pavel

2 голосов
/ 09 апреля 2010

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

1 голос
/ 09 апреля 2010

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

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

0 голосов
/ 09 апреля 2010

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

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

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

0 голосов
/ 09 апреля 2010

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

-sa

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...