2011-04-15 109 views
1

我最近設置了solr和haystack來搜索我的一個django模型。我試圖修改由草垛建成使用默認的Solr模式的NGramTokenizerFactoryHaystack沒有返回Solr管理控制檯亮點的結果

<fieldType name="text" class="solr.TextField"> 
    <analyzer type="index"> 
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="32" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="32" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

我有一堆在我的數據庫一個或兩個詞的條目,我想來匹配用戶的查詢。例如,我可能有一個標題爲「dog」的對象,另一個標題爲「cat」。如果用戶搜索「狗貓」,那麼我想返回該查詢的狗和貓對象。

同樣,如果我搜索「我的酷網站」,我希望返回「網站」字段。

我嘗試使用solr管理界面來檢查以確保我的查詢得到匹配。似乎一切都還好吧: enter image description here: 的問題是,當我用草堆默認搜索界面來搜索相同的查詢: enter image description here

正如你所看到的,沒有結果發現。我嘗試使用KeywordFactory和一堆不同的solr配置。如果我沒有弄錯,那麼查詢應該得到匹配。我不確定乾草堆爲什麼會變空。

感謝您的任何幫助/建議,如果這是最好的方式去這樣的搜索。

回答

1

幾個月前我曾與django-haystack和solr。我對solr做了一些特殊的查詢也遇到了問題。 其實這應該由addng下一行來解決,以settings.py

HAYSTACK_DEFAULT_OPERATOR = 'OR' # actually has no effect... 

但它不爲我工作。

因此,在我的情況下,它是通過繼承SearchView類來解決的。這是我的項目的小片段:

# views.py: 
from haystack.views import SearchView 

class PeriodicalSearchView(SearchView): 
    def get_results(self): 
    """ 
    Fetches the results via the form. 
    Returns an empty list if there's no query to search with. 
    """ 
    if not (self.form.is_valid() and self.form.cleaned_data['q']): 
     return self.form.no_query_found() 

    query = self.form.cleaned_data['q'] 

    words = iter(set(query.split())) 
    word = words.next() 
    sqs = self.form.searchqueryset.filter(text=word) # actually I have one more field here... 
    for word in words: 
     sqs = sqs.filter_or(title=word).filter_or(text=word) 

    if self.load_all: 
     sqs = sqs.load_all() 

    return sqs 

    def __call__(self, request, template_name=None): 
    """ 
    Generates the actual response to the search. 
    Relies on internal, overridable methods to construct the response. 
    """ 
    if template_name: 
     self.template = template_name 

    return super(PeriodicalSearchView, self).__call__(request) 

而且urls.py

# urls.py: 
from .views import PeriodicalSearchView 

urlpatterns = patterns('', 
    url(r'^search/$', PeriodicalSearchView(template='template_search.html'), 
    name='haystack_search'), 
) 

就是這樣。

+0

感謝您的完整答案。這實現了我想要的。 – 2011-04-17 18:49:21