ARACOOOL
@ARACOOOL
PHP Developer

Как сравнивать составить битовую маску с большим количеством условий?

Есть много условий (страна, модель устройства, производитель и т.д.). Мне нужно составить битовую маску для различных существующих устройств, что бы определить есть ли определенный товар.
Пару условий:
Один товар может принадлежать к нескольким странам и производителям.
У товара может не быть страны.

Не могу понять как составить маску к примеру для стран, что бы позже определить есть ли определенная страна или нет.
Как мне составить битовую маску что бы можно было сравнить новый товар с условиями?
  • Вопрос задан
  • 594 просмотра
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Вообще мне кажется что битовые маски не самый эффективный способ организовать фасеточный поиск.

Можно сделать несколько битовых маск, типа каждый бит значения - флаг наличия в конкретной стране (из этого следует ограничение, что мы можем использовать только 32/64 страны на значение в зависимости от платформы для long unsigned). Ну и дальше по аналогии.
Ответ написан
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
Для каждого пункта из фильтра (страна-россия, например, или модель-а5, например) храните битмап длиной N бит, где N - кол-во товаров всего. В битмапе 1 на месте k означает принадлежность товара с id=k этому пункту фильтра. Вот и всё. Очевидно что id товаров должны начинаться с 1, ну или закрепите offset = MIN(id) для каждого индекса товара, чтобы сопоставлять его с битом в битмапе.

При таком подходе у вас нет никаких ограничений - на множественную принадлежность, на выборку с условиями И или ИЛИ (например цвет красный И страна Россия, или цвет красный ИЛИ цвет зелёный), которые решаются обычным перемножением или сложением битмапов.

Всё это хозяйство прекрасно хранится в Redis с его прекрасной поддержкой битмапов и полным набором операций по ним.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы