Форум OlegON > Ресурсы OlegON > Вопросы сервера > База штрихкодов

Поиск штрихкодов по названию

21.01.2021 16:26


04.09.2020 09:38
drklord
 
Дополню:

В качестве оптимизации, кол-во кодов можно выдавать только в случае отсутствия параметра с порядковым номером штрихкода.

В варианте 2 тоже можно запрашивать штрихкоды по порядковому номеру, но т.к. неизвестно точное их количество, рано или поздно, номер выйдет за границы, что должно вернуться ошибкой, которая, в свою очередь, тоже лишняя нагрузка.
04.09.2020 09:50
OlegON
 
Видимо, придется подумать совместно. Поясню, как это выглядит с моей стороны.
В базе есть штрихкоды и наименования. Штрихкод один, а вот наименований несколько.
Поиск по наименованию - fulltext с сортировкой по релевантности. Поэтому смысл наличия других кодов приблизительно нулевой. Они могут быть от совсем другого товара. Чтобы не ломать голову, что я имею ввиду, прошу в текущем веб-поиске попробовать с разными вариантами - все ли правильно выдает?
Я могу выводить количество в найденном. А вот фильтровать бааальшой список из 1000 наименований, выдавая только 999й - накладно для сервака. Поэтому я и предполагал, что автор софтины, если ему нужно более одного наименования - выберет, например, сразу 10 и делает с ними потом, что хочет. Это и мне проще, и ему быстрее. Но, чтобы народ не хитрил и не ддосил меня тут запросами, баллы будут сниматься за запрошенное количество.
Нужно такое?
04.09.2020 10:35
drklord
 
Спасибо за подробности.

Запрос 415666-B21:
1. HP AMD OPTERON 8212 PROCESSOR (HP 415666-B21)
2. VALENTA BOOKLET SLIM CLASSIC GALAXY S3 (VALENTA 415666)

У обоих пунктов одинаковый штрихкод, по которому нашелся №2, но мне он не нужен, т.к. не соответствует запросу.

Запрос ST3146707FC:
1. SEAGATE CHEETAH 146.8GB 3.5" FIBRE CHANNEL INTERNAL HARD DRIVE (SEAGATE ST3146707FC)
2. SEAGATE CHEETAH 146.8GB 3.5" FIBRE CHANNEL INTERNAL HARD DRIVE (SEAGATE ST3146707FC)
3. SEAGATE CHEETAH 146.8GB 3.5" FIBRE CHANNEL INTERNAL HARD DRIVE (SEAGATE ST3146707FC)
4. SEAGATE CHEETAH 146.8GB 3.5" FIBRE CHANNEL INTERNAL HARD DRIVE (SEAGATE ST3146707FC)
5. SEAGATE CHEETAH 146.8GB 3.5" FIBRE CHANNEL INTERNAL HARD DRIVE (SEAGATE ST3146707FC)
6. SEAGATE CHEETAH 146.8GB 3.5" FIBRE CHANNEL INTERNAL HARD DRIVE (SEAGATE ST3146707FC)
7. SEAGATE CHEETAH 146.8GB 3.5" FIBRE CHANNEL INTERNAL HARD DRIVE (SEAGATE ST3146707FC)
8. NETAPP 144 GB 10.000 RPM 2 GBPS FC DISK DRIVE (NETAPP ST3146707FC-3)
9. HEWLETT PACKARD ENTERPRISE 146GB FIBER CHANNEL DRIVE (HEWLETT PACKARD ENTERPRISE ST3146707FC-RFB)

1. Этот штрихкод внутренний и неуникальный, мне он не подходит
2. Видимо, он не внутренний и уникальный, подходит

Таким образом, лично мне, при поиске по наименованию, не нужны записи, найденные по id штрихкода, только не внутренние, уникальные штрихкоды и их наименования, такая ситуация сложилась в связи с учетом товаров по партам, а сейчас необходимо вести учет по штрихкодам.

Сделайте, пожалуйста, для универсальности:
1. Вывод кол-ва результатов по наименованию, без добавления других товаров, по id штрихкодов
2. Возможность указания лимита результатов в запросе, т.е. изначально получаю 1 штрихкод, если не подошел, то сразу 10 и дальше уже перебираю.
3. Возможность указания параметра на поиск внешних/внутренних/всех штрихкодов (если такой параметр есть в БД).
4. Возможность указания параметра на поиск уникальных штрихкодов (если такой параметр есть в БД).

Про списание баллов не считаю возможным что-то комментировать.
04.09.2020 11:25
OlegON
 
Для начала, чтобы исключить эти внутренние и неуникальные, я просто их вообще все грохну, давно собирался сделать, это никому не нужный мусор. И настрою регулярную очистку, если вдруг еще попадет мусор откуда-то.

Теперь ближе к алгоритму.

1. Запрос строки (-1 балл) c указанием вывода только точного вхождения подстроки или релевантного поиска.
2. Вывод массива id:наименование по этой строке в количестве до 10 штук (не хочу утяжелять соединением со штрихкодами, особенно в свете того, что они все не нужны и баллы придется снимать за каждый)
3. Запрос ID (-1 балл)
4. Вывод штрихкода по ID

про списание баллов я упомянул, чтобы понимать, если тебе это становится невыгодно, то лучше и не начинать...
04.09.2020 11:38
drklord
 
Я правильно понимаю, что на получение штрихкода по названию потребуется 2 балла?

1 бал на запрос id штрихкода по наименованию
1 бал на запрос штрихкода по его id, ранее полученному из предыдущего запроса
04.09.2020 12:23
OlegON
 
да, я подумал, другого компромисса не вижу. если выдавать баркоды вместе с наименованием, то придется сразу 10 баллов снимать, при том, что запрос тяжелый. Ни мне эта тяжесть не нужна, ни получателю 10 могут быть не нужны. если есть другие варианты - предлагай.
04.09.2020 19:10
drklord
 
Извиняюсь за долгий ответ, я предлагаю в первом запросе, помимо id штрихкода, выводить первый штрихкод с наименованием, таким образом, после первого запроса будут получены не только внутренние данные (id штрихкода), использование которых вновь требует баллов, но и цель запроса, релевантность которой зависит от самого пользователя, поэтому он будет стараться сделать запрос максимально точным.
04.09.2020 19:55
OlegON
 
я не очень понял... во втором пункте по моему алгоритму выводить не только id, но и штрихкод? я об этом и писал, запрос будет сильно тяжелее, поэтому либо я буду за пару шк-товар брать за каждую балл, либо народ начнет меня ддосить, потому, что некоторые это делают в надежде сосканировать всю базу, а цель? получил список наименований, выбери то, что тебе нужно и запроси ш/к?
нюанс еще в том, что во многих случаях нельзя искать по точному вхождению, вроде part number, поэтому максимально точный запрос невозможен. Т.е. кто-то ищет по части наименования, между словами которой может быть что-то еще...
04.09.2020 20:22
drklord
 
Делайте, как запланировали, вариант рабочий, спасибо.
05.09.2020 19:40
OlegON
 
Собрал, сейчас опишу еще в общей теме по API
Вот морда для тестов.
https://olegon.ru/showthread.php?t=34552

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.