Как повысить точность выборки по поисковому запросу?

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

muno
muno
Репутация: 0
Сообщения: 18
Зарегистрирован: 20.08.2020
С нами: 2 месяца 5 дней

Сообщение #1 muno » 18.09.2020, 20:29

Доброго!

Подскажите, как настроить ПОИСК во второй версии? А именно, повысить его точность, чтобы всё, что не соответствует 100%, проходило мимо.

Пользователей утомляет, что на запрос, к примеру "10" уже на этапе выпадающего списка подсказок вылезают как "10" (и они выделены цветом), так и 100, 1000 и даже "1 (бла-бла) 50". А после осуществления поиска вообще вываливается столько мусора, что искомый товар проще найти по категориям.

Тупизна поиска а-ля Алиэкспресс снижает рейтинг и доверие к ресурсу.

Спасибо

korshunov
korshunov
Репутация: 73
Сообщения: 1233
Зарегистрирован: 03.12.2015
С нами: 4 года 10 месяцев
Skype

Сообщение #2 korshunov » 19.09.2020, 09:54

muno писал(а):Доброго!
Подскажите, как настроить ПОИСК во второй версии?

Никак, потому что никаких настроек для этого в CMS не предусмотрено.

muno писал(а):повысить его точность, чтобы всё, что не соответствует 100%, проходило мимо.

Такое даже у поисковиков с миллиоными бюджетами не всегда получается.

muno писал(а):Пользователей утомляет, что на запрос, к примеру "10" уже на этапе выпадающего списка подсказок вылезают как "10" (и они выделены цветом), так и 100, 1000 и даже "1 (бла-бла) 50". А после осуществления поиска вообще вываливается столько мусора, что искомый товар проще найти по категориям.

Ситуация в примере, возможно, происходит потому, что ищется вхождение '10', кроме прочего, также и в артикуле. А в артикулах такое встречается часто и к желаниям ищущего никакого отношения не имеет.

Чтобы улучшить ситуацию, надо менять под Ваши цели поисковый запрос в api/Products.php...

makki
makki
Репутация: 186
Сообщения: 568
Зарегистрирован: 12.08.2016
С нами: 4 года 2 месяца
Откуда: Киев
Сайт Skype

Сообщение #3 makki » 19.09.2020, 13:52

Для поиска с выпадающим списком надо править ajax/search_products.php
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2

muno
muno
Репутация: 0
Сообщения: 18
Зарегистрирован: 20.08.2020
С нами: 2 месяца 5 дней

Сообщение #4 muno » 20.09.2020, 13:13

спасибо, я нашёл блок, посвящённый поиску.

К сожалению, стандартные пути повышения качества поисковой выдачи, а именно замена "LIKE" на "=" и удаления "%" в начале и в конце kw, ничего не дали.

korshunov
korshunov
Репутация: 73
Сообщения: 1233
Зарегистрирован: 03.12.2015
С нами: 4 года 10 месяцев
Skype

Сообщение #5 korshunov » 20.09.2020, 13:37

Очень сомнительно, чтобы такие способы ничего не дали.
Скорее всего, меняете в одном месте, а проверяете в другом.
Поисков-то как минимум два - по адресу ?keуword=sometext и "живой" поиск...

Могу проверить, если дадите FTP и точно укажете, где что неверно...

muno
muno
Репутация: 0
Сообщения: 18
Зарегистрирован: 20.08.2020
С нами: 2 месяца 5 дней

Сообщение #6 muno » 20.09.2020, 19:00

Да, возможно, и скорее всего, я косячю, так как с более серьезными кодами, нежели HTML, сталкиваюсь вплотную впервые.

Я использую (и проверяю) только тот поиск, который в специальной поисковой строке в шапке сайта. К слову, в попытках разобраться с точностью поиска, у меня перестал выпадать список подсказок(( но я ничего подобного не отключал, и не нарушал. Никогда не лез туда, в чём не разобрался.

Конечно, Вы правы. Эти радикальные способы повлияли на поиск. Я неправильно выразился. Аббревиатуры и сложные комбинации цифр и букв теперь ищутся беспрецедентно точно. Другое дело, что выдача на пресловутый keyword "10" не изменилась ни на йоту. По-прежнему в выдаче фигурируют и "100", и "1000", и даже "1 (blah-blah) 50". И как с этим бороться - идеи иссякли.

korshunov
korshunov
Репутация: 73
Сообщения: 1233
Зарегистрирован: 03.12.2015
С нами: 4 года 10 месяцев
Skype

Сообщение #7 korshunov » 21.09.2020, 05:21

muno писал(а):Другое дело, что выдача на пресловутый keyword "10" не изменилась ни на йоту. По-прежнему в выдаче фигурируют и "100", и "1000", и даже "1 (blah-blah) 50". И как с этим бороться - идеи иссякли.

Надо анализировать весь процесс, особенно запрос в БД. И проверять все детали.

И подозреваю, что от поиска на '10' Вы хотите слишком много.
Во-первых, посмотрите, даст ли Вам Яндекс на поиск по '10' в точности то, что Вы хотели найти.
Во-вторых, результат зависит от данных на сайте. Например, если в названии товара прописан какой нибудь код (что часто делают, например, для телевизоров), то очень возможно, что '10' будет обнаруживаться почти у всех товаров.

zyxer M
zyxer M
Возраст: 29
Репутация: 57
Сообщения: 303
Зарегистрирован: 03.02.2016
С нами: 4 года 8 месяцев
Откуда: Днепр

Сообщение #8 zyxer » 21.09.2020, 07:05

На сколько я понимаю, вы хотите чтобы поиск был только по полному слову, не по части. Как вариант не самого элегантного решения (но в теории рабочего для вашего случая) создать у товара отдельное поле search_keywords, в котором через разделитель будут написаны слова для поиска. Также важно чтобы текст начинался и заканчивался на этот разделитель. Например: "|слово1|10|слово2|", и сделать поиск только по этому полю, без поиска по имени и прочим полям.

Суть поиска заключается в том, чтобы найти по запросу "10" записи LIKE "%|10|%", таким образом вы укажите границы слова. Можно также попробовать искать по полю имя, но тогда нужно делать сложнее, где для всех слов кроме первого и последнего подойдет поиск LIKE "% 10 %", для первого подойдет LIKE "10 %", для последнего LIKE "% 10", но в таком случае будет слишком много лайков, а они достаточно медленные.

Также для первого варианта нужно делать отдельный скрипт, который будет наполнять поле search_keywords после обновления товара.
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

korshunov
korshunov
Репутация: 73
Сообщения: 1233
Зарегистрирован: 03.12.2015
С нами: 4 года 10 месяцев
Skype

Сообщение #9 korshunov » 21.09.2020, 08:33

Чтобы не изобретать велосипед, можно еще попробовать такой способ
https://habr.com/en/post/40218/

zyxer M
zyxer M
Возраст: 29
Репутация: 57
Сообщения: 303
Зарегистрирован: 03.02.2016
С нами: 4 года 8 месяцев
Откуда: Днепр

Сообщение #10 zyxer » 21.09.2020, 09:00

да, об этом методе тоже знаю. Он тоже не плох, но в данном случае он может человеку только хуже сделать. Дело в том, что MATCH-AGAINST сам решает коэффициент релевантности слова и слово "100" может посчитать вообще не релевантным, а "10" даже искать не будет. + Он также ищет только по колонкам, по которым есть индекс FULLTEXT (соответственно колонки должны быть в рамках одной таблицы) и поэтому поиск по артикулу будет невозможен что также приведет к каким-то доделкам для поиска по артикулу
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

muno
muno
Репутация: 0
Сообщения: 18
Зарегистрирован: 20.08.2020
С нами: 2 месяца 5 дней

Сообщение #11 muno » 21.09.2020, 20:41

zyxer писал(а):Суть поиска заключается в том, чтобы найти по запросу "10" записи LIKE "%|10|%", таким образом вы укажите границы слова.

LIKE я давно заменил на "=", проценты поудалял... Разделители меня вполне бы устроили, если понять, куда их поставить. Попробовал несколько вариантов, ни один не сработал...

Код: Выделить всё

    $keyword = $okay->request->get('query', 'string');
    $keyword_filter = '';
    if (!empty($keyword)) {
        $keywords = explode(' ', $keyword);
        foreach ($keywords as $kw) {
            $kw = $okay->db->escape($kw);
            if($kw!='') {
                $keyword_filter .= $okay->db->placehold("AND (
                        $px.name = '%|$kw|%'
                        OR $px.meta_keywords = '%|$kw|%'
                        OR p.id in (SELECT product_id FROM __variants WHERE sku = '%|$kw|%')
                    ) ");
            }
        }
    }

korshunov
korshunov
Репутация: 73
Сообщения: 1233
Зарегистрирован: 03.12.2015
С нами: 4 года 10 месяцев
Skype

Сообщение #12 korshunov » 22.09.2020, 05:42

Если Вы пытаетесь использовать совет zyxer, то так легко не пойдет. В частности, надо готовить данные специальным образом, как он выше написал.

Если хочется учитывать границы слов, попробуйте использовать regexp примерно так:
SELECT * FROM ok_products WHERE name REGEXP '\\b10\\b'


Название раздела: Вопросы по работе с OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Вопросы по работе с OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 2 гостя