9

TLDR;

django、django-haystack、solrではさまざまなブースティングタイプがどのように連携しますか?

最も明白な検索結果を最初に表示するのに問題があります。10件の結果を検索しcaring for othersて取得すると、タイトルの付いたオブジェクトがcaring for others結果の2番目に表示されcaring for yourselfます。

ドキュメントブースト

ルートノードの場合は1.9、第2レベルの場合は1.8、第3レベルの場合は1.7など、ブーストされCategoryたオブジェクトをドキュメント化しました。factor = 2.0 - ((the mptt tree level)/10)(または190%、180%、170%...など)

フィールドブースト

タイトルはboost=1.5150%の正の係数でブーストされますコンテンツはboost=.550%の負の係数でブーストされます

タームブースト

現在、検索用語を増やしていません。

私の目標

結果のカテゴリと記事のリストを取得したい(カテゴリの結果をまっすぐに取得するまで、記事を無視します)。カテゴリは記事よりも重みが高く、タイトルはコンテンツよりも重みが高くなっています。また、ルートカテゴリノードを子ノードよりも高く重み付けしようとしています。

どこかで重要なコンセプトが欠けているような気がします。

情報

haystackの組み込みの検索フォームと検索ビューを使用しています。

次のpackage/libバージョンを使用しています。

Django==1.4.1
django-haystack==1.2.7
pysolr==2.1.0-beta

マイインデックスクラス

class CategoryIndex(SearchIndex):
    """Categorization -> Category"""
    text = CharField(document=True, use_template=True, boost=.5)
    title = CharField(model_attr='title', boost=1.5)
    content = CharField(model_attr='content', boost=.5)
    autocomplete = EdgeNgramField(model_attr='title')

    def prepare_title(self, object): 
        return object.title

    def prepare(self, obj):
        data = super(CategoryIndex, self).prepare(obj)
        base_boost = 2.0
        base_boost -= (float(int(obj.level))/10)
        data['boost'] = base_boost
        return data

私の検索テンプレートtemplates/search/categorization/category_text.txt

{{ object.title }}
{{ object.content }}

アップデート

{{ object.content }}検索テンプレートを削除すると、そのレコードが期待どおりの順序で表示され始めたことに気づきました。どうしてこれなの?

4

2 に答える 2

2

Dismax パーサー (さらに、SOLR 3.1 以降の ExtendedDismax) は、まさにこれらのニーズに合わせて作成されました。検索するすべてのフィールドを構成し ('qf' パラメーター)、それぞれにカスタム ブースティングを追加し、フレーズ ヒットが特に価値のあるフィールドを指定できます (ヒットのスコアに追加; 'pf' パラメーター)。また、検索で一致する必要があるトークンの数を指定することもできます (柔軟なルール パターンによって、'mm' パラメーターを使用)。

たとえば、構成は次のようになります (solrconfig.xml の要求ハンドラー構成エントリの一部 - 干し草スタックでそれを行う方法に慣れていません。これは単純な SOLR です):

<str name="defType">dismax</str>
<str name="q.alt">*:*</str>
<str name="qf">text^0.5 title^1.5 content^0.5</str>
<str name="pf">text title^2 content</str>
<str name="fl">*,score</str>
<str name="mm">100%</str>
<int name="ps">100</int>

haystack についてはわかりませんが、Dismax 機能を提供するようです: https://github.com/toastdriven/django-haystack/pull/314

Dismax については、このドキュメントを参照してください (ExtendedDismax にもリンクされています): http://wiki.apache.org/solr/DisMaxQParserPlugin http://wiki.apache.org/solr/ExtendedDisMax

于 2012-09-20T08:46:37.420 に答える
0

ここでは、これらすべてのブーストで賢くなりすぎているようです。

たとえば、デフォルトの検索ビューを使用している場合、フィールド内のものは完全に針です。実際、デフォルトで実行される auto_query は検索に 1 つのフィールドのみを使用します。このフィールドのみが document=true としてマークされています。また、haystack は実際にこのフィールド コンテンツに内部的に名前を付けているため、競合を避けるために検索インデックスで名前を変更することをお勧めします。

それが役に立たない場合 (おそらく役に立たない場合)、カスタム検索フォームを作成するか、ブーストしたいフィールドをテンプレートに複数回配置して、簡単な回避策を使用して目的を達成する必要があります。

{{ object.title }}
{{ object.title }}
{{ object.content }}
于 2012-09-12T20:33:36.083 に答える