1

Djapian を使用してキーワードでオブジェクトを検索していますが、結果をフィルタリングできるようにしたいと考えています。これには、Django の QuerySet API を使用すると便利です。たとえば、次のようになります。

if query.strip():
    results = Model.indexer.search(query).prefetch()
else:
    results = Model.objects.all()
results = results.filter(somefield__lt=somevalue)
return results

しかし、Djapian は、オブジェクトではなくResultSet、オブジェクトの を返します。もちろん、Pythonでオブジェクトを「手動で」フィルタリングできますが、すべてのオブジェクトをフィルタリングする場合(クエリが空の場合)は現実的ではありません-データベースからテーブル全体を取得する必要があります。HitModel

これにDjapianを使用するのは不運ですか?

4

2 に答える 2

4

ソースを調べたところ、Djapian には結果に適用できるフィルター メソッドがあることがわかりました。以下のコードを試してみたところ、うまくいっているようです。

私のインデクサーは次のとおりです。

class MarketIndexer( djapian.Indexer ):

    fields = [ 'name', 'description', 'tags_string', 'state']
    tags = [('state', 'state'),]

結果をフィルタリングする方法は次のとおりです(ワイルドカードの使用を行う最初の行は気にしないでください):

objects = model.indexer.search(q_wc).flags(djapian.resultset.xapian.QueryParser.FLAG_WILDCARD).prefetch()
objects = objects.filter(state=1)

実行されるとMarket、状態が「1」に等しい が表示されるようになりました。

于 2009-09-28T01:21:39.457 に答える
0

私は Djapian を知りませんが、xapian には精通しています。Xapian では、MatchDeciderで結果をフィルタリングできます。

一致ディサイダーの決定関数は、検索条件に一致するすべてのドキュメントで呼び出されるため、ここですべてのドキュメントに対してデータベース クエリを実行することはお勧めできませんが、もちろんドキュメントの値にアクセスすることはできます。

たとえば、ubuntuusers.deには、ブログ投稿、フォーラム投稿、惑星エントリ、wiki エントリなどを含む xapian データベースがあり、xapian データベース内の各ドキュメントには、値として保存された追加のアクセス情報があります。クエリの後、AuthMatchDecider は潜在的なドキュメントをフィルター処理し、フィルター処理された MSet を返します。これはユーザーに表示されます。

決定手順が somefield < somevalue のように単純である場合、( sortable_serializexapian が提供する関数を使用して) ドキュメントの値に somefield の値を単純に追加し、(を使用してOP_FILTER)OP_VALUE_RANGE元のクエリにクエリを追加することもできます。

于 2009-09-27T17:26:02.770 に答える