Мне нужен какой-то полнотекстовый поиск в базе данных MySQL - PullRequest
1 голос
/ 24 января 2011

Я застрял с одной довольно сложной проблемой.

У меня есть список продуктов с разных складов, где каждый продукт имеет: Brand and Model плюс некоторые дополнительные детали. Model может сильно отличаться от разных складов для одного и того же продукта, но Brand всегда одинаково.

Весь список продуктов я храню в одной таблице, скажем, это будет Product таблица. Затем у меня есть другая таблица - Model, с ПРАВИЛЬНО Название модели , Brand и дополнительными сведениями, такими как изображение, описание и т. Д. Кроме того, у меня есть столбец ключевых слов, где я пытаюсь добавить все ключевые слова вручную.

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

Вот лишь несколько примеров имен, которые у меня есть:

  • WINT.SPORT3D
  • WINT.SPORT3D XL
  • WINT.SPORT 3D
  • WINT.SPORT3D MO
  • ЗИМНИЙ СПОРТ 3D

Правильное название для всех этих предметов будет: WINTER SPORT 3D, поэтому все они должны быть назначены одной и той же модели.

Итак, есть ли способ улучшить полнотекстовый поиск или другой метод решения моей проблемы?

База данных, которую я использую, - MySQL, я бы не хотел ее менять.

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Я начну с составления более формального определения таблиц:

warehouse:
    warehouse_id,
    warehouse_product_id,
    product_brand,
    product_name,
    local_id

Здесь я бы использовал local_id в качестве внешнего ключа к вашей таблице «Модель», но чтобы избежать дальнейшей путаницы,Я назову это 'local'

local:
    id,
    product_brand,
    product_name

Кажется, что таблица, которую вы описываете как 'product', является избыточной.

Очевидно, что до перекрестной ссылки на данные local_id будет нулевым.Но после того, как он будет заполнен, его не нужно будет менять, и, учитывая warehouse_id, группу и продукт, вы можете легко найти свой локальный дескриптор:

SELECT local.*
FROM local, warehouse
WHERE local.id=warehouse.local_id
AND warehouse.product_brand=local.product_brand
AND warehouse_id=_____
AND warehouse.product_brand=____
AND warehouse.product_name=____

Так что все, что вам нужно сделать, это заполнитьссылки.Soundex - довольно грубый инструмент - лучшим решением для этого был бы алгоритм расстояния Левенштейна .Здесь есть реализация mysql

Учитывая набор строк в таблице хранилища, которые необходимо заполнить:

SELECT w.*
FROM warehouse w
WHERE w.local_id IS NULL;

... для каждой строки определить лучшийсопоставить как (используя значения из предыдущего запроса как w. *) ....

SELECT local.id
FROM local
WHERE local.product_brand=w.product_brand
ORDER BY levenstein(local.product_name, w.product_name) ASC
LIMIT 0,1

Но это найдет наилучшее совпадение, даже если 2 строки совершенно разные!Следовательно ....

SELECT local.id
FROM local
WHERE local.product_brand=w.product_brand
AND levenstein(local.product_name, w.product_name)<
    (IF LENGTH(local.product_name)<LENGTH(w.product_name),
          LENGTH(local.product_name), LENGTH(w.product_name))/2
ORDER BY levenstein(local.product_name, w.product_name) ASC
LIMIT 0,1

... требуется как минимум половина строки для сопоставления.

Таким образом, это можно реализовать в одном операторе обновления:

UPDATE warehouse w
SET local_id=(
   SELECT local.id
   FROM local
   WHERE local.product_brand=w.product_brand
   AND levenstein(local.product_name, w.product_name)<
    (IF LENGTH(local.product_name)<LENGTH(w.product_name),
          LENGTH(local.product_name), LENGTH(w.product_name))/2
   ORDER BY levenstein(local.product_name, w.product_name) ASC
   LIMIT 0,1
 )
 WHERE local_id IS NULL;
1 голос
/ 21 июня 2011

Попробуйте Soundex .Все ваши примеры разрешаются в W532, а последний - в W536.Итак, вы можете:

  1. Добавить столбец PRODUCT и MODEL в PRODUCT и MODEL с именем SoundexValue и рассчитать значение Soundex для каждого продукта и модели
  2. Сравнить значения Soundex в таблице PRODUCT с темив таблице моделей.Возможно, вам придется использовать диапазон (+/- 5), чтобы получить более высокий уровень соответствия.
  3. Следуйте правилу 80/20.То есть, тратить 80% своих ручных усилий на 20%, которые не выпадают легко.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...