我的網絡應用程序中有一個文本字段,允許用戶按名稱查找其他人。您開始在框中輸入內容,並且服務器在您輸入時發回可能的匹配。我設置了草堆/ Solr的後端用一個簡單的搜索索引:在django-haystack中跨越單詞邊界的自動完成
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"
注意,它是查詢「翁SMI」接受不返回任何東西,而不是匹配「約翰·史密斯」。
但是,使用Haystack/Solr,「Smi」,「J」和「John Sm」完全沒有結果。要讓Haystack/Solr返回任何內容,我必須使用整個單詞。根據Haystack文檔,我應該使用NgramField來跨越單詞邊界進行匹配,但似乎沒有這樣做。有任何想法嗎?