Я думал об этом. Придумал такую логику: пока в поисковой строке нет ничего, в списке видно обычное дерево с возможностью раскрытия веток. Как только начинается поиск, дерево убирается, все работает точно так, как сейчас (то есть выдает простой список найденного) до тех пор, пока либо юзер не кликнет в один из найденных пунктов, либо пункт не останется один. В этот момент дерево возвращается, но неким удобным образом сворачивается -- здесь надо думать, как именно. Например, все более мелкие районы показаны, но свернуты обычным образом, а все более крупные районы показываются, но свернуты в состояние, когда виден только подрайон, ведущий к искомому.
Но это все требует настолько долгого программирования, что я сильно сомневаюсь в реальности осуществления этого нашими силами.
Отдельно реализации деревьев на JS есть (
JSTree,
Dynatree), и к JSTree даже есть поиск, но работает он соврешенно неудобно.