Ключевое слово для SQL-поиска
-
21-09-2019 - |
Вопрос
Пример использования
Когда пользователь заходит на мой веб-сайт, он сталкивается с окном поиска, очень похожим на ЭТО.Они могут искать результаты, используя текст плана."вопросы .net", "закрытые вопросы", ".net и java" и т.д..Поиск будет функционировать немного иначе, чем SO, в том смысле, что он будет пытаться получить как можно больше информации о схеме базы данных, а не прямой полнотекстовый поиск.Таким образом, "вопросы .net" будут искать только вопросы .net, в отличие от ответов .net (вероятно, это неприменимо к случаю SO, просто пример здесь), "закрытые вопросы" вернут закрытые вопросы, вопросы ".net и java" вернут вопросы, относящиеся к .net и java, и ничего больше.
Проблема
Я не слишком знаком с этими словами, но я в основном хочу использовать ключевое слово для поиска, управляемого SQL.Я знаю схему базы данных, и я также могу обрабатывать данные в базе данных.Я хочу знать любые текущие подходы, которые уже существуют, прежде чем я попытаюсь это реализовать.Я предполагаю, что этот вопрос касается того, что является хорошим дизайном для заявленной проблемы.
Предлагаемый
Мое предлагаемое решение пока выглядит примерно так
- Очистите входные данные.Просто удалите все специальные символы
- Разбейте входные данные на фрагменты данных.Разбейте ввод "c # java" на c #, и java также обработает особые случаи, такие как "вопросы 'c # java'", на 'c # java' и "вопросы".
- Постройте дерево на основе входных данных
- Привяжите данные к метаданным.Поэтому преобразуйте такие материалы, как закрытые вопросы, и соотнесите их с isclosed столбцом таблицы.
- Преобразуйте дерево в sql-запрос.
Мысли / предложения / ссылки?
Решение
Я управляю магазином цифровой музыки с "единым поиском", который взвешивает ключевые слова на основе их встречаемости и схемы, в которой отображаются Продукты, например.с разными столбцами, такими как "Исполнитель", "Название" или "Издатель".
Продукты также связаны с альбомами и плейлистами, но для более простого объяснения я остановлюсь только на индексации и запросе ключевых слов продуктов.
Схема базы данных
Keywords
таблица - взвешенная таблица для каждого слова, которое, возможно, можно было бы найти (следовательно, на него где-то есть ссылка) со следующими данными для каждой записи:
- Идентификатор ключевого слова (не само слово),
- Само Слово,
- Альфа-значение Soundex для Слова
- Вес
ProductKeywords
таблица - взвешенная таблица для каждого ключевого слова, на которое ссылается любое из полей (или столбцов) продукта, со следующими данными для каждой записи:
- Идентификатор продукта,
- Идентификатор ключевого слова,
- Вес
Взвешивание ключевых слов
Значение взвешивания указывает на то, как часто встречаются эти слова.Совпадающие ключевые слова с меньшим весом "более уникальны" и с большей вероятностью будут тем, что ищется.Таким образом, часто встречающиеся слова автоматически "взвешиваются в меньшую сторону", например."тот", "а" или "я".Однако лучше всего удалить атомарные вхождения этих распространенных слов перед индексацией.
Я использовал целые числа для взвешивания, но использование десятичного значения обеспечит большую универсальность, возможно, при немного более медленной сортировке.
Индексирование
Всякий раз, когда обновляется какое-либо поле продукта, например.Исполнитель или название (что случается не так часто), триггер базы данных переиндексирует ключевые слова продукта таким образом внутри транзакции:
- Все ключевые слова продукта разъединяются и удаляются, если на них больше нет ссылок.
- Каждое индексированное поле (напр.Исполнитель) значение сохраняется /извлекается как ключевое слово целиком и связано с продуктом в
ProductKeywords
таблица для прямого совпадения. - Затем вес ключевого слова увеличивается на значение, которое зависит от важности поля.Вы можете добавлять или вычитать вес в зависимости от важности поля.Если Исполнитель важнее названия, вычтите 1 или 2 из его
ProductKeyword
регулировка веса. - Каждое индексированное значение поля очищается от любых не буквенно-цифровых символов и разбивается на отдельные группы слов, например."Билли Джоэл" становится "Билли" и "Джоэл".
- Каждая отдельная группа слов для каждого значения поля расшифровывается и сохраняется / извлекается как ключевое слово и ассоциируется с продуктом таким же образом, как на шаге 2.Если ключевое слово уже было связано с продуктом, его вес просто корректируется.
Запрашивающий
- Возьмите строку поиска входного запроса целиком и найдите ключевое слово, непосредственно совпадающее.Извлеките все ключевые слова ProductKeywords для ключевого слова из таблицы в памяти вместе с весом ключевого слова (отличным от веса ключевого слова ProductKeyword).
- Удалите все не буквенно-цифровые символы и разделите запрос на ключевые слова.Извлеките все существующие ключевые слова (совпадут лишь немногие).Объедините ProductKeywords для сопоставления ключевых слов с таблицей в памяти вместе с весом ключевого слова, который отличается от веса ключевого слова PRODUCT.
- Повторите Шаг 2, но вместо этого используйте значения soundex, скорректировав веса так, чтобы они были менее релевантными.
- Присоедините полученные ключевые слова продукта к связанным продуктам и получите данные о продажах каждого продукта, которые являются показателем популярности.
- Сортируйте результаты по весу ключевого слова, весу ключевого слова продукта и продажам.Окончательное суммирование / сортировка и / или взвешивание зависят от вашей реализации.
- Ограничьте результаты и верните результаты поиска продукта клиенту.
Другие советы
То, что вы ищете, это Обработка естественного языка.Как ни странно , это использованный быть включенным бесплатно в качестве Запрос на английском языке в SQL Server 2000 и более ранних версиях.Но теперь это ушло
Некоторыми другими источниками являются :
- http://devtools.korzh.com/eq/dotnet/
- http://www.easyask.com/products/business-intelligence/index.htm
Концепция представляет собой словарь метаданных, отображающий слова в таблицу, столбцы, взаимосвязи и т.д., И анализатор английских предложений, объединенные вместе для преобразования английского предложения (или только некоторых ключевых слов) в реальный запрос
Некоторые люди даже используют английский запрос с распознаванием речи для некоторых действительно крутых демоверсий, хотя никогда не видели, чтобы это использовалось в anger!
Если вы используете SQL Server, вы можете просто использовать его Полнотекстовый поиск функция, которая специально разработана для решения вашей проблемы.
Вы могли бы использовать гибридный подход, взять результаты полнотекстового поиска и дополнительно отфильтровать их на основе метаданных из вашего # 4.Для чего-то более интеллектуального вы могли бы создать простое решение для обучения под наблюдением, отслеживая, по каким ссылкам пользователь нажимает после поиска, и сохраняя этот выбор вместе с ключевыми словами поиска в дереве решений.Затем поисковые запросы будут извлечены из этого дерева решений