2011-04-15 6 views
1

私は最近、私のdjangoモデルの1つを検索するためにsolrとhaystackを設定しました。私が使用する干し草の山で構築されたデフォルトのSolrのスキーマを変更しようとしNGramTokenizerFactoryHaystackが戻ってこないSolr Admin Consoleのハイライト

<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> 

私は、ユーザーのクエリにマッチしたいと思い、私のデータベース内の1つのまたは2つのワードエントリの束を持っています。たとえば、タイトルが「犬」のオブジェクトと、タイトルが「猫」のオブジェクトがあります。ユーザーが "dog cat"を検索した場合、そのクエリのdogオブジェクトとcatオブジェクトの両方を返したいと思います。

同様に、「私のクールなウェブサイト」を検索すると、「ウェブサイト」を含むフィールドが返されます。

solr管理インターフェイスを使用して、クエリが一致しているかどうかを確認しました。すべてが大丈夫あるようです:あなたが見ることができるように enter image description here

、何も結果が見つからない: enter image description here:私はその同じクエリを検索するための干し草の山のデフォルトの検索インタフェースを使用する場合 問題があります。私はKeywordFactoryとさまざまなsolr設定を使ってみました。私が間違っていなければ、クエリになるはずです。なぜ乾草が空になっているのかわからない。

このような検索については、これが最善の方法であるかどうかについてのお手伝いやご提案ありがとうございます。

答えて

1

2か月前私はdjango-haystackとsolrと協力しました。私はsolrにいくつかの特別な問い合わせをすることにも問題がありました。

HAYSTACK_DEFAULT_OPERATOR = 'OR' # actually has no effect... 
しかし、それは私のために動作しません: は、実際には settings.pyに次の行をaddngによって解決されなければなりません。

私の場合は、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

完全な回答をいただきありがとうございます。これは私が望んだものを達成しました。 –