Форум → Разработка → Базы данных → Как правильно построить поиск
Как правильно построить поиск
Страницы: ← Следующая страница →
-
Доброго, Всем, времени суток. Застали меня в расплох с одной задачей.
Таблица: vovan
Поля: model, oem1, oem2, oem3 …
В каждом поле миллион миллиардов строк.
Например:
334505;1-11.222;…
334 505;111.222;…
334-505;111-222;…
334.505;111222;…
Запрос на поиск: "334 505".
Каким образом сделать так, чтобы все 4 строки были найдены? Есть ли варианты удаления спецсимволов или есть другие способы?
Пока вижу только одно решение, это в запросе на поиск удалять все спецсимволы (точки, запятые, пробелы, дефисы, плюсы и прочее), но перед этим сконвертировав всю базу на удаление данных спецсимволов так же. -
20 февраля 2013 г. 2:25, спустя 29 минут 2 секунды
http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html
http://monosnap.com/image/RxZPuatsWMfXz847DvrYUsSPpСапожник без сапог -
20 февраля 2013 г. 8:34, спустя 6 часов 8 минут 47 секунд
developer, дуд тебе правильно подсказывает, я только уточню для случая если тебе надо будет постоянно и быстро находить такие строки.
скорость за счет избыточности: добавь еще одно поле в которое помести обработанный вариант строки без лишних символов. сделай по нему индекс и ищи по нему "очищенную" строку без регулярок и паттернов.ιιlllιlllι унц-унц -
20 февраля 2013 г. 12:59, спустя 4 часа 25 минут 1 секунду
Поставь Solr, могу, хуёнгу, чёго там ещё, дохера всякого поискового говна есть, тем более на такое количество записей -
20 февраля 2013 г. 16:30, спустя 3 часа 31 минуту 23 секунды
Странно что никто не сказал про http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundexСпустя 81 сек.Хотя для цифр оно не подойдет, точноСпустя 44 сек.
mysql> SELECT SOUNDEX('Hello'),SOUNDEX('Hello?'),SOUNDEX('Hi'),SOUNDEX('H3ll0');
+——————+——————-+—————+——————+
| SOUNDEX('Hello') | SOUNDEX('Hello?') | SOUNDEX('Hi') | SOUNDEX('H3ll0') |
+——————+——————-+—————+——————+
| H400 | H400 | H000 | H400 |
+——————+——————-+—————+——————+
1 row in set (0.00 sec)https://smappi.org/ - платформа по созданию API на все случаи жизни -
20 февраля 2013 г. 18:02, спустя 1 час 31 минуту 14 секунд
а зачем?) лайк использует индексы и как раз для таких целей создан …
Странно что никто не сказал про http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundexСпустя 81 сек.Хотя для цифр оно не подойдет, точноСпустя 44 сек.
mysql> SELECT SOUNDEX('Hello'),SOUNDEX('Hello?'),SOUNDEX('Hi'),SOUNDEX('H3ll0');
+——————+——————-+—————+——————+
| SOUNDEX('Hello') | SOUNDEX('Hello?') | SOUNDEX('Hi') | SOUNDEX('H3ll0') |
+——————+——————-+—————+——————+
| H400 | H400 | H000 | H400 |
+——————+——————-+—————+——————+
1 row in set (0.00 sec)Сапожник без сапог -
-
20 февраля 2013 г. 18:40, спустя 32 минуты 4 секунды
чо удивляешься? :)лайк использует индексы
О_оСапожник без сапог -
20 февраля 2013 г. 19:01, спустя 20 минут 17 секунд
like 'string%' использует индексы
like '%string' - нетне всё полезно, что в swap полезло -
20 февраля 2013 г. 20:19, спустя 1 час 18 минут 52 секунды
Например:
334505;1-11.222;…
334 505;111.222;…
334-505;111-222;…
334.505;111222;…
Запрос на поиск: "334 505".
Каким образом сделать так, чтобы все 4 строки были найдены? Есть ли варианты удаления спецсимволов или есть другие способы?
ни like ни regexp тут не подойдут, потому что положат базу. можно а) использовать fulltext-поиск б) заранее подготовить строки и сохранить в пригодном для поиска виде в другое поле или в) использовать другой поисковый движок
а. искомые поля должны быть типа text или производные и по ним должен быть полнотекстовый индекс. жопа в том, что если у тебя innodb то для них полнотекстовый индекс не поддерживается, точнее, поддерживается, но в каком-то экспериментальном виде и кажется только в версии движка 5.5+. во всяком случае неприятно выкручиваться с помощью говнокостылей типа такого http://habrahabr.ru/post/114572/
вторая жопа в том, что в индекс на стандартных настройках мускула включаются только слова из 4х и более символов, т.е. если ты на стандартном хостинге - то жопа, а на своём полужопа, но тебе придётся перекомпилировать мускуль
б. берёшь вот это говно
334505;1-11.222;…
334 505;111.222;…
334-505;111-222;…
334.505;111222;…
и каждую строку разбиваешь на примитивы, сначала по точке с запятой потом по остальным символам. получаешь строки
334505
334
505
1
11
222
111
111222
потом сохраняешь в отдельной таблице в EAV, ищешь строгим совпадением
вариант говно конечно, но может работать
в) прикрутить какой-нибудь сфинкс. но я в нём не особо, спроси кого-нибудь ещё
–
сам запрос "334 505" преобразуешь в
("334" AND "505") OR "334505" OR "505334"
либо в
"334" OR "505" OR "334505" OR "505334"
то есть ищешь по любому из совпадений и по сочетаниям
в зависимости от того, будет это вариант а или б адаптируй к MATCH или =не всё полезно, что в swap полезло -
20 февраля 2013 г. 21:05, спустя 45 минут 11 секунд
пздц, никто с tecdoc в mysql не работал? может у кого есть желания заработать на мне денех? -
20 февраля 2013 г. 21:20, спустя 15 минут 34 секунды
developer, не работал, но сама база возможно мне пригодится. у тебя какая?не всё полезно, что в swap полезло -
-
20 февраля 2013 г. 21:41, спустя 12 минут 51 секунду
у меня лежит в mysql за первый квартал 12-го года, колупаю её.
вес 2 ги 984 м. россия, европа, все запросы. свежую могу купить.Структура папок и файлов:
base.full/ - SQL-дамп полной базы (для всех стран и на всех языках)
base.noctm/ - SQL-дамп полной базы (для всех стран и на всех языках)
без колонки поставляемости запчастей в разные страны - по объёму после загрузки
в MySQL в 4 раза меньше базы base.full!
base.europe/ - SQL-дамп базы, отфильтрованной по группе стран "Европа" (код 248) на всех языках -
по объёму после загрузки в MySQL в 4 раза меньше базы base.full!
base.russia/ - SQL-дамп базы, отфильтрованной по группе стран "Страны бывшего СССР" (код 204) и
русскому языку (код 16) - по объёму после загрузки в MySQL в 5 раз меньше базы base.full!
distributive/ - дистрибутив каталога TecDoc (в виде образов DVD-дисков), из которого выгружались данные,
таблетка к нему нормально работает под Windows XP/Vista/7/2003/2008/2008 R2.
queries/ - примеры SQL-запросов к базе MySQL
queries/Filter_Country_Language/ - Скрипт для уменьшения размера базы данных: фильтрует данные по стране и/или языку.
Позволяет получить из базы base.full свой аналог базы base.russia по любой
комбинации страны/языка.
addons/count_rows - количество строк в каждой таблице всех версий базы данных (можно использовать для проверки: всё ли залилось?)
addons/models.php - PHP-пример вывода всех моделей автомобилей марки ALFA ROMEO (на основе примера SQL-запроса MODELS.sql)
addons/SEARCH_TREE4.xlsx - таблица с деревом категорий всех запчастей
addons/tecdoc_schema.png - графическая схема связей между основными таблицами Текдока
tecdoc_tables.txt - описание основных таблиц TecDoc'а
useful_tables.txt - список таблиц, использованных в моих примерах SQL-запросах - позволит вам не загружать в базу данных ненужные таблицы.
задача в том чтобы наладить хотя бы какую-то поисковую систему по прайсам поставщикам (загрузка их в базу и поиск по ней, либо по номерам либо по выбору автомобиля), про корзину в магазине и личные кабинеты уже молчу.
работал всё время с shop-script premium, oscommerce vam edition, vamshop, сейчас вот думаю может к virtuemart 2 пытаться притулить или к magento. -
20 февраля 2013 г. 21:44, спустя 3 минуты 5 секунд
developer, а есть таблица с поставщиками?
кстати, не просветишь, чем отличается эта база http://www.plati.ru/asp/pay.asp?id_d=882286 от этой http://rutracker.org/forum/viewtopic.php?t=4310014 ?не всё полезно, что в swap полезло
Страницы: ← Следующая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!