Ключевое слово для поиска SQL - PullRequest
1 голос
/ 19 марта 2010

Вариант использования

Когда пользователь заходит на мой сайт, он сталкивается с окном поиска, очень похожим на SO.Они могут искать результаты, используя текст плана.".net questions", "закрытые вопросы", ".net и java" и т. д. Поиск будет работать несколько иначе, чем SO, в том смысле, что он будет пытаться использовать как можно больше схемы базы данных, а непрямой полнотекстовый поиск.Таким образом, «.net questions» будет искать только .net вопросы, а не .net ответы (вероятно, не относится к случаю SO, просто пример здесь), «закрытые вопросы» будут возвращать закрытые вопросы «.net и java»вопросы будут возвращать вопросы, которые относятся к .net и java, и ничего больше.

Проблема

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

Предложено

Мое предлагаемое решение до сих пор выглядит примерно так

  1. Очистить ввод.Просто удалите все специальные символы
  2. Разберите ввод на куски данных.Разбейте ввод "c # java" на c # и java. Также обрабатывайте особые случаи, такие как "'c # java' questions", в "c # java" и "questions".
  3. Построение дерева из ввода
  4. Свяжите данные в метаданные.Так что конвертируйте такие вещи, как закрытые вопросы и привязывайте их к закрытому столбцу таблицы.
  5. Преобразуйте дерево в SQL-запрос.

Мысли / предложения / ссылки?

Ответы [ 4 ]

4 голосов
/ 26 марта 2010

Я управляю магазином цифровой музыки с «единым поиском», который взвешивает ключевые слова на основе их появления и схемы, в которой появляются продукты, например. с разными столбцами, такими как «Исполнитель», «Заголовок» или «Издатель».

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

Схема базы данных

Keywords таблица - взвешенная таблица для каждого слова, которое можно найти (следовательно, где-то на него ссылаются) со следующими данными для каждой записи:

  • идентификатор ключевого слова (не слова),
  • Само Слово,
  • Альфа-значение Soundex для Слова
  • Вес

ProductKeywords таблица - взвешенная таблица для каждого ключевого слова, на которое ссылается любое из полей (или столбцов) товара, со следующими данными для каждой записи:

  • Идентификатор продукта,
  • Идентификатор ключевого слова,
  • Вес

Вес ключевых слов

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

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

Индексация

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

  1. Все ключевые слова продукта отсоединяются и удаляются, если на них больше нет ссылок.
  2. Каждое индексированное значение поля (например, Artist) сохраняется / извлекается как ключевое слово целиком и относится к продукту в таблице ProductKeywords для прямого соответствия.
  3. Вес ключевого слова увеличивается на величину, которая зависит от важности поля. Вы можете добавлять, вычитать вес в зависимости от важности поля. Если Artist важнее чем Title, вычтите 1 или 2 из его ProductKeyword регулировки веса.
  4. Каждое значение индексированного поля убирается из любых не алфавитно-цифровых символов и разбивается на отдельные группы слов, например. «Билли Джоэл» становится «Билли» и «Джоэл».
  5. Каждая отдельная группа слов для каждого значения поля озвучивается и сохраняется / извлекается как ключевое слово и связывается с продуктом так же, как на шаге 2. Если ключевое слово уже было связано с продуктом, его вес просто корректируется .

1055 * Запросы * Полностью взять строку поиска входного запроса и найти ключевое слово с прямым соответствием. Получите все ключевые слова ProductKeywords для ключевого слова в таблице в памяти вместе с весом ключевого слова (отличается от веса ProductKeyword). Удалять все не алфавитно-цифровые символы и разбивать запрос на ключевые слова. Получите все существующие ключевые слова (только несколько будут соответствовать). Присоедините ProductKeywords к соответствию ключевых слов в таблице в памяти вместе с весом ключевого слова, который отличается от веса ProductKeyword. Повторите шаг 2, но вместо этого используйте значения soundex, корректируя веса, чтобы они были менее значимыми. Присоедините извлеченные ProductKeywords к соответствующим продуктам и получите данные о продажах каждого продукта, что является показателем популярности. Сортировка результатов по весу ключевого слова, весу ключевого слова продукта и продажам. Окончательное суммирование / сортировка и / или взвешивание зависят от вашей реализации. Ограничение результатов и возврат результатов поиска продукта клиенту.

3 голосов
/ 23 марта 2010

То, что вы ищете, это Обработка естественного языка . Как ни странно, этот использовал , чтобы быть включенным бесплатно как Английский запрос в SQL Server 2000 и более ранних версиях. Но это ушло сейчас

Некоторые другие источники:

Концепция представляет собой словарь метаданных, отображающий слова в таблицу, столбцы, отношения и т. Д., И анализатор английского предложения, объединенный вместе для преобразования английского предложения (или только некоторых ключевых слов) в реальный запрос

Некоторые люди даже пользуются английским запросом с распознаванием речи для некоторых действительно крутых демо, хотя никогда не видели, чтобы его использовали в гневе!

0 голосов
/ 25 марта 2010

Вы можете использовать гибридный подход, взять полнотекстовые результаты поиска и дополнительно отфильтровать их на основе метаданных из вашего # 4. Для чего-то более интеллектуального вы можете создать простое контролируемое учебное решение, отслеживая ссылки, по которым нажимает пользователь после поиска, и сохраняйте этот выбор с ключевыми словами поиска в дереве решений. Поиск будет производиться из этого дерева решений

0 голосов
/ 19 марта 2010

Если вы используете SQL Server, вы можете просто использовать его Полнотекстовый поиск , специально разработанный для решения вашей проблемы.

...