2

ドキュメントをオプションでユーザーIDに関連付けることができるデータセットがあります。ドキュメントが本を表しており、各本に1人以上の所有者がいるとします。検索するときは、自分が所有していない本を照合する前に、自分が所有している本を最初に照合したいと思います。次に、自分が所有するすべての結果を、自分が所有していない結果の前に結果の上部に並べ替えます。したがって、データは次のようになります。

Owner ID             Book Title
--------             ----------
13                   To Have and To Have Not
14                   To Have and To Have Not
19                   To Have and To Have Not
15                   Snow Crash
17                   Snow Crash
18                   Cryptonomicon
14                   Of Mice And Men

ユーザーIDが14で、「have」を検索すると、13または19が所有する本ではなく、自分が所有する本を最初に検索したいとします(これにより、リストの一番上に並べ替えることができます。それを所有する)。しかし、「クラッシュ」を検索すると、どちらも所有していなくても、そのタイトルに一致する本のいずれかを見つけたいと思います。私はそれらを所有していないので、それらはソートの下位に表示されます。したがって、「a」をあいまい検索すると、自分が所有する一致するすべての本がリストの一番上に表示され、残りはリストの後に表示されます。

これがクエリなのか、フィルタなのか、あるいはその両方なのか、私は少し立ち往生しています。たとえば、重複するすべてのタイトルを削除して、自分が所有するタイトルを優先するフィルターを作成し、残りのタイトルに対して単純な検索を実行することができます(検索の前にフィルターが適用されると仮定します)。そうすれば、所有者に基づくカスタムソートは簡単です。

しかし、フィルターの実装方法がわかりません。2つのフィールドで動作するため、単純なDuplicateFilterではありません。これは、Lucene in Actionのセクション5.6.7のセキュリティフィルターの例に似ていますが、同じタイトルの本を所有していない場合でも、所有していないドキュメントを表示できるようにしたい点が異なります。セクション6.4のカスタムフィルターも近いですが、2つのフィールドに依存しているため、私の問題はより複雑です。

ドキュメントを反復処理している間、フィルターはどのタイトルが表示されたかを記憶し、私が所有しているタイトルを保持する必要があります。たとえば、上記の値を順番に繰り返すと、私が所有していない「持っている」と「持っていない」というタイトルが表示されます。次に、私が所有する同じタイトルをもう一度表示し、最初のドキュメントを削除して2番目のドキュメントを保持する必要があることを知っておく必要があります。大量のメモリを使用せずにこれを行う方法を考えることはできません。基本的に、反復中にすべてのタイトルをメモリに保持しますが、これは非常にコストがかかるようです。一致するかどうかはセット内の他のドキュメントに依存するため、これは単純な「一致」関数ではありません。

ガイダンスや情報をありがとうございます。

4

1 に答える 1

0

これは、クエリ ヒットのカスタム ソートのように聞こえます。2 つのドキュメントのスコアが同じ場合、「優先所有者」を持つドキュメントが検索結果の最初に表示されます。

于 2014-01-07T01:39:34.707 に答える