1

最近、私のdjangoモデルの1つを検索するためにsolrとhaystackを設定しました。haystackによって構築されたデフォルトのsolrスキーマを変更して、NGramTokenizerFactory:を使用しようとしました。

<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つの単語エントリがあり、ユーザーのクエリと照合します。たとえば、「犬」というタイトルのオブジェクトと「猫」というタイトルのオブジェクトがあるとします。ユーザーが「dogcat」を検索した場合、そのクエリのdogオブジェクトとcatオブジェクトの両方を返します。

同様に、「my cool website」を検索すると、「website」のフィールドが返されます。

solr管理インターフェースを使用して、クエリが一致していることを確認してみました。ここではすべて問題ないようです ここに画像の説明を入力してください::問題は、haystackのデフォルトの検索インターフェースを使用して同じクエリを検索する場合です。 ここに画像の説明を入力してください

ご覧のとおり、結果は見つかりません。私はKeywordFactoryとさまざまなsolr構成を使用してみました。私が間違っていなければ、クエリは一致しているはずです。なぜ干し草の山が空になっているのかわかりません。

これがそのような検索を行うための最良の方法であるかどうかについてのヘルプ/提案をありがとう。

4

1 に答える 1

1

数ヶ月前、私はdjango-haystacksolrと一緒に仕事をしました。また、solrに特別なクエリを実行する際にも問題が発生しました。実際には、次の行を次の行に追加することで解決する必要があります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'),
)

以上です。

于 2011-04-15T17:39:09.300 に答える