В моем веб-приложении есть текстовое поле, которое позволяет пользователям находить других людей по имени.Вы начинаете вводить текст в поле, и сервер отправляет возможные совпадения при вводе.Я настроил бэкэнд Haystack / Solr с помощью простого поискового индекса:
class UserIndex(SearchIndex):
text = NgramField(document=True, model_attr='get_full_name')
site.register(BerlinrUser, UserIndex)
Затем я запускаю manage.py build_solr_schema, скопировал схему в мой каталог solf / conf, перезапустил solr, и, наконец, запустил manage.py update_index.
В моем представлении django у меня есть следующий код поиска:
q = request.GET.get("q")
search_result = SearchQuerySet().models(User).autocomplete(content=q)
for result in search_result:
# Collect user IDs, pull from database, and send back a JSON result
Проблема в том, что автозаполнение не возвращает то, что я хочу.Учитывая эту коллекцию пользователей:
John Smith
John Jingleheimer-Schmidt
Jenny Smith
Вот поведение, которое я хочу:
Query: Expected result:
"John" "John Smith",
"John Jingleheimer-Schmidt"
"Smith" "John Smith",
"Jenny Smith"
"Smi" "John Smith",
"Jenny Smith"
"J" <Anybody with a first or last name that begins with "J">
"John Sm" "John Smith"
Обратите внимание, что для запроса "ohn Smi" допустимо ничего не возвращать, так какв отличие от сопоставления с «Джоном Смитом».
Однако, используя Haystack / Solr, «Smi», «J» и «John Sm» не дают результатов вообще.Чтобы Haystack / Solr возвращал что-либо, я должен использовать целые слова.Согласно документации Haystack, я должен использовать NgramField для сопоставления между границами слов, но, похоже, он этого не делает.Есть идеи?