ドキュメントをオプションでユーザー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番目のドキュメントを保持する必要があることを知っておく必要があります。大量のメモリを使用せずにこれを行う方法を考えることはできません。基本的に、反復中にすべてのタイトルをメモリに保持しますが、これは非常にコストがかかるようです。一致するかどうかはセット内の他のドキュメントに依存するため、これは単純な「一致」関数ではありません。
ガイダンスや情報をありがとうございます。