За последние 24 часа нас посетили 70255 программистов и 5687 роботов. Сейчас ищут 1150 программистов ...

Поиск по имени, фамилии и отчеству

Тема в разделе "PHP для новичков", создана пользователем виталий032, 8 янв 2019.

  1. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.971
    Симпатии:
    753
    работает запрос?
    эскейп должен быть какой-то обязательно
    mysqli_ в процедурке юзаешь?
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Я бы поступил так: проанализировал проблему, нашел ее источник и не стал бы усложнять то, что можно упростить. Источник - это произвольный ввод ФИО.

    Зачем делать для ФИО сплошную строку ввода? :)
    А откуда пользователю знать, в каком порядке что вводить? Строку поиска гугла имитируете? А оно точно нужно?
    Делайте отдельно 3 поля. И будете иметь структуру, которая идеально ложится на 3 колонки. Можно бахнуть составной индекс на них даже. Только не уникальный, а то ФИО так себе уник.

    Нет, в вашем случае:
    1) храним имя, фамилию, отчество, через пробел в БД
    2) полученный ввод бьем на слова по пробелу через explode
    3) формируем динамически запрос, чтобы там были секции where like %% по количеству слов, полученных со входа
    4) за один запрос стреляем в цель

    Или типа того.

    Не усложняйте, упрощайте.
     
    webtask и виталий032 нравится это.
  3. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.971
    Симпатии:
    753
    + ты не знаешь на сколько слов ты разбил строчку
    добро пожаловать в клуб, братан :)
     
    виталий032 нравится это.
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.897
    Симпатии:
    718
    @виталий032 рабочий пример поиска по одному полю, с подсветкой и ранжированием.
    Код (Text):
    1. select id, name, ts_headline(name, query, 'StartSel=<em>, StopSel=</em>') as headline,
    2.                        ts_rank(to_tsvector('english', name), query) as rank
    3. from datatable, to_tsquery('english', 'PS91:* | ecst:* | x3:*') as query
    4. where to_tsvector('english', name) @@ query
    5. order by rank desc;
    Единственная сложность здесь - преобразовать пользовательский ввод в формат tsquery, но в принципе это решается парой замен в пользовательском запросе, синтаксис очень прост.
    https://postgrespro.ru/docs/postgrespro/10/textsearch-controls

    По скорости:
    Таблица небольшая, ~200к записей, запрос выполняется ~700мс, что довольно много конечно. После добавления индекса
    Код (Text):
    1. CREATE INDEX IF NOT EXISTS idx_datatable_vector ON datatable
    2.   USING gin(to_tsvector('english', name));
    Скорость выполнения запроса ~11мс, что приемлемо )

    Далее можете покурить setweight, что бы искать сразу по нескольким полям с различными весами для полей, а мои полномочия на этом всё )

    p.s.
    Код (Text):
    1. select id, name from data_goods_tyres
    2. where name LIKE '%PS91%' OR name LIKE '%ecst%' OR name LIKE '%x3%'
    выполняется ~40мс с индексом по полю, но без выделения и ранжирования.

    Итог: я бы лично не заморачивался и остановился на LIKE, при необходимости - переехал на первый вариант. Если его допилить, то на нем спокойно можно будет дожить до нагрузок требующих отдельных решений типа elastic`а.
     
    artoodetoo и виталий032 нравится это.
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.012
    Симпатии:
    1.679
    Адрес:
    :сердА
    Вот вы загоняетесь... 3 поля ввода и ок.
     
    AlexProg и webtask нравится это.