Я бы сказал, что вы должны создать наборы синонимов (например, дешевые, малобюджетные и т. Д., Перейдите в synset: 1) и отобразить каждый токен из строки поиска в одну из этих групп.
Кстати, этоздесь будет легко справляться с орфографическими ошибками, так как в общем случае это довольно небольшое пространство для поиска.Отредактируйте расстояние, обычные k-граммы, ... все должно быть в порядке.
На следующем шаге вы должны создать инвертированные списки индексов для каждой из этих син-групп на карте с отсортированным списком ресторанов, которые могут бытьсвязано с этим свойством.Получите все эти списки для каждой сингруппы из запроса и просто пересекайте их.
Слова, которые нельзя сопоставить с одним из этих наборов, вероятно, придется игнорировать, если у вас нет своего рода полных текстов о ресторанах, которые вы также можете индексировать.В этом случае вы также можете составить такие списки ресторанов для «нормальных» слов и пересекать их.Но это уже было бы довольно близко к классическим поисковым системам, и было бы неплохо использовать такую технологию, как apache lucence.Без полных текстов я не думаю, что вам понадобится такая вещь, потому что инвертированный индекс snygroups действительно легко обрабатывать самостоятельно.