Я управляю магазином цифровой музыки с «единым поиском», который взвешивает ключевые слова на основе их появления и схемы, в которой появляются продукты, например. с разными столбцами, такими как «Исполнитель», «Заголовок» или «Издатель».
Продукты также связаны с альбомами и плейлистами, но для более простого объяснения я остановлюсь только на индексации и запросах ключевых слов продуктов.
Схема базы данных
Keywords
таблица - взвешенная таблица для каждого слова, которое можно найти (следовательно, где-то на него ссылаются) со следующими данными для каждой записи:
- идентификатор ключевого слова (не слова),
- Само Слово,
- Альфа-значение Soundex для Слова
- Вес
ProductKeywords
таблица - взвешенная таблица для каждого ключевого слова, на которое ссылается любое из полей (или столбцов) товара, со следующими данными для каждой записи:
- Идентификатор продукта,
- Идентификатор ключевого слова,
- Вес
Вес ключевых слов
Весовое значение указывает на то, как часто встречаются слова. Соответствующие ключевые слова с меньшим весом являются «более уникальными» и, скорее всего, будут тем, что ищут. Таким образом, часто встречающиеся слова автоматически «понижаются», например. «то», «а» или «я». Тем не менее, перед индексацией лучше всего удалить атомарные вхождения этих общих слов.
Я использовал целые числа для взвешивания, но использование десятичного значения обеспечит большую гибкость, возможно, с несколько более медленной сортировкой.
Индексация
Каждый раз, когда обновляется любое поле продукта, например. Исполнитель или название (что случается не так часто), триггер базы данных повторно индексирует ключевые слова продукта, например, внутри транзакции:
- Все ключевые слова продукта отсоединяются и удаляются, если на них больше нет ссылок.
- Каждое индексированное значение поля (например, Artist) сохраняется / извлекается как ключевое слово целиком и относится к продукту в таблице
ProductKeywords
для прямого соответствия.
- Вес ключевого слова увеличивается на величину, которая зависит от важности поля. Вы можете добавлять, вычитать вес в зависимости от важности поля. Если Artist важнее чем Title, вычтите 1 или 2 из его
ProductKeyword
регулировки веса.
- Каждое значение индексированного поля убирается из любых не алфавитно-цифровых символов и разбивается на отдельные группы слов, например. «Билли Джоэл» становится «Билли» и «Джоэл».
- Каждая отдельная группа слов для каждого значения поля озвучивается и сохраняется / извлекается как ключевое слово и связывается с продуктом так же, как на шаге 2. Если ключевое слово уже было связано с продуктом, его вес просто корректируется .
1055 * Запросы *
Полностью взять строку поиска входного запроса и найти ключевое слово с прямым соответствием. Получите все ключевые слова ProductKeywords для ключевого слова в таблице в памяти вместе с весом ключевого слова (отличается от веса ProductKeyword).
Удалять все не алфавитно-цифровые символы и разбивать запрос на ключевые слова. Получите все существующие ключевые слова (только несколько будут соответствовать). Присоедините ProductKeywords к соответствию ключевых слов в таблице в памяти вместе с весом ключевого слова, который отличается от веса ProductKeyword.
Повторите шаг 2, но вместо этого используйте значения soundex, корректируя веса, чтобы они были менее значимыми.
Присоедините извлеченные ProductKeywords к соответствующим продуктам и получите данные о продажах каждого продукта, что является показателем популярности.
Сортировка результатов по весу ключевого слова, весу ключевого слова продукта и продажам. Окончательное суммирование / сортировка и / или взвешивание зависят от вашей реализации.
Ограничение результатов и возврат результатов поиска продукта клиенту.