Делал примерно так с базой фиас, засовывая её в монгодб на питоне.
Не совпадает ни одного пункта, но идея, думаю, ясна :)
namstrip = re.compile(' *\([^)]*\) *') # всякая хрень в скобочках
namsplit = re.compile('\W+') # небуквы
namnum = re.compile('([0-9]+)[\w-]+') # 5ый, 6-ой, 101км, итп
num = re.compile('^[0-9]+') # числа
def idx_name(name):
name = name.lower()
name = namstrip.sub(' ', name) # нахер всё в скобочках
name = namnum.sub('\\1', name) # 5ый, 6-ой, 101км -> 5, 6, 101
namelems = namsplit.split(name) # разбить на слова
namelems = filter(lambda e: len(e) > 1 or num.match(e), namelems) # оставить числа и длиннее 1 букв
return list(namelems)
результат - писался в поле name_idx и индексировался