Вопрос

Пример использования

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

Проблема

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

Предлагаемый

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Взвешивание ключевых слов

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

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

Индексирование

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

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

Запрашивающий

  1. Возьмите строку поиска входного запроса целиком и найдите ключевое слово, непосредственно совпадающее.Извлеките все ключевые слова ProductKeywords для ключевого слова из таблицы в памяти вместе с весом ключевого слова (отличным от веса ключевого слова ProductKeyword).
  2. Удалите все не буквенно-цифровые символы и разделите запрос на ключевые слова.Извлеките все существующие ключевые слова (совпадут лишь немногие).Объедините ProductKeywords для сопоставления ключевых слов с таблицей в памяти вместе с весом ключевого слова, который отличается от веса ключевого слова PRODUCT.
  3. Повторите Шаг 2, но вместо этого используйте значения soundex, скорректировав веса так, чтобы они были менее релевантными.
  4. Присоедините полученные ключевые слова продукта к связанным продуктам и получите данные о продажах каждого продукта, которые являются показателем популярности.
  5. Сортируйте результаты по весу ключевого слова, весу ключевого слова продукта и продажам.Окончательное суммирование / сортировка и / или взвешивание зависят от вашей реализации.
  6. Ограничьте результаты и верните результаты поиска продукта клиенту.

Другие советы

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

Некоторыми другими источниками являются :

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top