LINUX.ORG.RU

mysql: поиск по имени и синонимам (Спроектировать логику таблиц)

 


0

2

Всем привет.

Имеется таблица в mysql в 1 млн записей. К примеру это наименования автомобилей. Когда я ищю «жигули 2101» в базе, то нахожу «жигули 2101». А если ищу «жигуль» или «копейка» - соответственно ничего не найду. Я готов прописать синонимы вручную. Да их будет много, примерно 5000.

Вопрос: как мне это правильно сделать?

Уже существует таблица

synonym_id  |  synonym_name
1        |  копейка
1        |  жига
1        |  жигуль

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

★★

Последнее исправление: ex3me (всего исправлений: 6)

Замути поле с хэшем. Условие поиска:

where crc32('ищу') = hash_field and 'ищу' = synonym_name

MySQL должен оптимизировать and и не вычислять второе выражение. Ну и индекс по hash_field.

vahtu
()

и базы, наверное, уже есть

Deleted
()
Ответ на: комментарий от Deleted

помоему там задача чуть другая

ex3me ★★
() автор топика
Ответ на: комментарий от vahtu

у меня в 99% случаев нужно сделать синоним для слова жигули в строке «красивая белая жигули 90 года». Т.е. поиск в подстроке - хеш не катит

ex3me ★★
() автор топика
Ответ на: комментарий от ex3me

Бьёшь строку на слова и вычисляешь хэш каждого. Потом:

select word, synonym_name
from words
left join
  (select synonym_id, synonym_name from synonym_table where hash_field in (список хэшей)) on (word_id = synonym_id)

Потом пробегаешься по полученному списку и заменяешь подстроки synonym_name => word.

vahtu
()

Таблица синонимов отдельная не нужна. В обычной таблице ключевых слов просто поле synonym_id и там ссылка на поле этой же таблицы с «основной» формой.

Соответственно, при поиске, после стемминга, выдёргиваешь все записи искомых ключевых слов, если какие-то слова являются синонимами для других и они ещё не выдёргивались, дёргаешь базовую форму, получаешь ID ключевых слов и потом уже выдёргиваешь все записи из таблицы ссылок слов и материалов.

Обновление и поиск базы синонимов занимает много времени при всего лишь 150 синонимах.

Всего один (в худшем случае) копеечный лишний запрос.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Да, если что, у меня такая схема отлично работала на десятке миллионов записей в таблице привязок.

Тут главное — никаких хешей, никаких join'ов. Все объёмные пересечения — только на целых ID.

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.