Страница 1 из 1

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

Добавлено: 18.09.2020, 20:29
muno
Доброго!

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

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

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

Спасибо

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

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

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

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

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

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

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

Добавлено: 19.09.2020, 13:52
makki
Для поиска с выпадающим списком надо править ajax/search_products.php

Добавлено: 20.09.2020, 13:13
muno
спасибо, я нашёл блок, посвящённый поиску.

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

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

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

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

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

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

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

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

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

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

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

Также для первого варианта нужно делать отдельный скрипт, который будет наполнять поле search_keywords после обновления товара.

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

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

Добавлено: 21.09.2020, 20:41
muno
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|%')
                    ) ");
            }
        }
    }

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

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