|
Как осуществить быстрый поиск одновременно по нескольким полям типа TEXT
|
|||
---|---|---|---|
#18+
Привет. Есть БД mysql 5.5, категория данных - торговые точки, сайт с поиском. Объемы >10М записей в таблице для поиска. 3 таблицы: 1) tbl_markets - список магазинов; 2) tbl_params - набор поисковых признаков - ФИО владельца, адрес, геопараметры, график работы, ссылка на сайт, соц.сети - все в произвольном виде, валидации входных данных нет; 3) tbl_market_params - связь двух этих таблиц. Пользовательский кейс - юзер заходит в поиск и может ввести в поле все что угодно: "пятерочка","Тюмень","24/7" или может выбрать и заполнить несколько конкретных параметров одновременно присущих магазину: адрес "Московская обл" | владелец "Тамара павловна". На выходе должны быть магазины без дублей с ограничением N. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57.
Отрабатываю вариант like "%значение%". Полнотекстовый поиск InnoDB в 5.5 не поддерживается. Переход на более новую версию mysql считать невозможным. Да и fulltext тут скорее не подойдет, т.к. в полях могут быть цифры да и всякое другое, не совсем текстовые значения - номер телефона магазина, время работы, геопараметры, ссылки и т.д. Оптимальной считать скорость работы запроса ~5 сек. Попытки при >10М записей приводят к краху: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Если построить индекс по VALUE(50) и использовать value like 'USER_INPUT_DATA%' , отрабатывает ~ 2 сек, но нужно именно вхождение подстроки искать, например ссылка на сайт магазина может быть вида http://pina.ru , а может pina.ru валидации при добавлении потомучто нет - добавление ее считать невозможным, ну только в самом крайнем случае, если не найдется других вариантов оптимизации. Но, если пользователь ищет по нескольким конкретным параметрам у магазина, тут не выходит так быстро, даже с индексом, например по адресу + любое поле: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Пробовал использовать поисковый движок Sphinx , он специально заточен для быстрого поиска по текстовым полям MATCH-ем. Но там нет поддержки вложенных запросов с группировкой по одному полю, если юзер выбрал несколько параметров поиска. Подскажите, может поменять как-то на оптимальную структуру БД, или индексы или запросы? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2019, 22:28 |
|
Как осуществить быстрый поиск одновременно по нескольким полям типа TEXT
|
|||
---|---|---|---|
#18+
wayarПробовал использовать поисковый движок Sphinx , он специально заточен для быстрого поиска по текстовым полям MATCH-ем. Но там нет поддержки вложенных запросов с группировкой по одному полю, если юзер выбрал несколько параметров поиска.Насколько я помню, это называется фасетный/фасеточный поиск. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2019, 22:58 |
|
Как осуществить быстрый поиск одновременно по нескольким полям типа TEXT
|
|||
---|---|---|---|
#18+
miksoft, Приветствую. Тоже столкнулся с вопросом: табличка (лог астериска) 100млрд записей. Есть добавочные поля номеров телефонов в формате е164, что сильно упрощает задачу. Индексированы, но .. текстовые varchar(20) .. увы. Превращать их в BIGINT нет никакой возможности. Задача: Найти все звонки с заданного списка номеров (ок. 11тыс) длительностью более 4минут (asterisk.log поле duration) .. проблема в том, что номер может попасться как в "источнике" (поле src_e164 в asterisk.log) так и в приемнике (dst_e164 там же)! То есть надо писать что-то типа SELECT * FROM asterisk.log t WHERE t.dst_e164 IN(список из 11тыс номеров) OR t.src_e164 IN(тот же список) В общем .. "труба" .. работать будет "до завтра" на любом железе. Обидно что собственно запись одна и таже, и надо в ней проверять оба поля на принадлежность к списку. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 13:33 |
|
Как осуществить быстрый поиск одновременно по нескольким полям типа TEXT
|
|||
---|---|---|---|
#18+
Arhat109, список грузите во временную таблицу, 2 селекта по UNION, джойните с основной таблицей по каждому из полей ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 17:33 |
|
Как осуществить быстрый поиск одновременно по нескольким полям типа TEXT
|
|||
---|---|---|---|
#18+
Arhat109 SELECT * FROM asterisk.log t WHERE t.dst_e164 IN(список из 11тыс номеров) OR t.src_e164 IN(тот же список) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 20:38 |
|
Как осуществить быстрый поиск одновременно по нескольким полям типа TEXT
|
|||
---|---|---|---|
#18+
Как вариант - изменить структуру таблицы, хранить звонки в виде двух половинок звонка (как полупроводки) с одним полем для номера. И секционировать таблицу по этому номеру. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 20:41 |
|
|
start [/forum/topic.php?fid=47&tid=1828384]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 250ms |
total: | 378ms |
0 / 0 |