ФорумРазработкаБазы данных → Как правильно построить поиск

Как правильно построить поиск

  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 20 февраля 2013 г. 1:56

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

    Таблица: vovan
    Поля: model, oem1, oem2, oem3 …
    В каждом поле миллион миллиардов строк.
    Например:
    334505;1-11.222;…
    334 505;111.222;…
    334-505;111-222;…
    334.505;111222;…

    Запрос на поиск: "334 505".

    Каким образом сделать так, чтобы все 4 строки были найдены? Есть ли варианты удаления спецсимволов или есть другие способы?
    Пока вижу только одно решение, это в запросе на поиск удалять все спецсимволы (точки, запятые, пробелы, дефисы, плюсы и прочее), но перед этим сконвертировав всю базу на удаление данных спецсимволов так же.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 20 февраля 2013 г. 8:34, спустя 6 часов 8 минут 47 секунд

    developer, дуд тебе правильно подсказывает, я только уточню для случая если тебе надо будет постоянно и быстро находить такие строки.

    скорость за счет избыточности: добавь еще одно поле в которое помести обработанный вариант строки без лишних символов. сделай по нему индекс и ищи по нему "очищенную" строку без регулярок и паттернов.
    ιιlllιlllι унц-унц
  • Josh

    Сообщения: 2008 Репутация: N Группа: Кто попало

    Spritz 20 февраля 2013 г. 12:59, спустя 4 часа 25 минут 1 секунду

    Поставь Solr, могу, хуёнгу, чёго там ещё, дохера всякого поискового говна есть, тем более на такое количество записей
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 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 на все случаи жизни
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 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)


    а зачем?) лайк использует индексы и как раз для таких целей создан …
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 20 февраля 2013 г. 18:08, спустя 6 минут 44 секунды

    лайк использует индексы

    О_о
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 20 февраля 2013 г. 18:40, спустя 32 минуты 4 секунды


    лайк использует индексы

    О_о
    чо удивляешься? :)
    Сапожник без сапог
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 20 февраля 2013 г. 19:01, спустя 20 минут 17 секунд

    like 'string%' использует индексы
    like '%string' - нет
    не всё полезно, что в swap полезло
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 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 полезло
  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 20 февраля 2013 г. 21:05, спустя 45 минут 11 секунд

    пздц, никто с tecdoc в mysql не работал? может у кого есть желания заработать на мне денех?
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 20 февраля 2013 г. 21:20, спустя 15 минут 34 секунды

    developer, не работал, но сама база возможно мне пригодится. у тебя какая?
    не всё полезно, что в swap полезло
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 20 февраля 2013 г. 21:28, спустя 7 минут 39 секунд

    интересненько :)
    Сапожник без сапог
  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 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.
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 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 полезло

Пожалуйста, авторизуйтесь, чтобы написать комментарий!