Автозаполнение через границы слов в django-haystack - PullRequest
2 голосов
/ 19 августа 2011

В моем веб-приложении есть текстовое поле, которое позволяет пользователям находить других людей по имени.Вы начинаете вводить текст в поле, и сервер отправляет возможные совпадения при вводе.Я настроил бэкэнд 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 для сопоставления между границами слов, но, похоже, он этого не делает.Есть идеи?

1 Ответ

2 голосов
/ 19 августа 2011

Выяснил, почему запрос не работал должным образом.

Моя первая проблема была в определении индекса.Это должно было выглядеть так:

class UserIndex(SearchIndex):
    text = CharField(document=True)
    name_auto = NgramField(model_attr='get_full_name')

Другая проблема была в моем файле Solr schema.xml.Для minGramSize было установлено значение «3», что препятствовало работе запросов длиной до 3 символов.Установка значения «1», перезапуск Solr и перестройка индекса устранили проблему.

...