2011-08-18 65 views
2

我的網絡應用程序中有一個文本字段,允許用戶按名稱查找其他人。您開始在框中輸入內容,並且服務器在您輸入時發回可能的匹配。我設置了草堆/ 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來跨越單詞邊界進行匹配,但似乎沒有這樣做。有任何想法嗎?

回答

2

找到了查詢未按預期工作的原因。

我的第一個問題是在索引定義中。它應該看起來像這樣:

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

另一個問題是在我的Solr schema.xml文件中。 minGramSize設置爲「3」,這將防止3個字符以下的查詢無法正常工作。將其設置爲「1」,重新啓動Solr並重建索引可解決問題。