2009-07-07 9 views
2

全文検索のこの単純なシナリオを想像してみてください。私はコメントでテキストでも記事を検索したいそれだけで実装するのはかなり簡単です。Luceneとアクセス制御(コメントの可視性)

すべてのコメントがすべてのユーザーに表示されているわけではありません。コメントを書き込むユーザーは、具体的な役割への可視性を制限することもできます(コメントには、テキストとロールという2つのフィールドがあります)。

記事のルーセン検索を制限することは可能ですか?現在のユーザー(comment.roleは現在のユーザーの役割のセット内にあります)で表示されるコメント内のみを表示しますか?

もしそうなら、私はそれについてどうやってそのような質問(好ましくは)またはluceneフィルターを書くべきかを教えてください。

(私は休止状態-検索経由のLuceneを使用していますが、それは何の違いを作るべきではありません)

答えて

2

docsによると、あなたはちょうどあなたがクエリ内の別のフィールドとしてに興味のある役割を与えることができます。あなたの例では、このようなものがうまくいくはずです:

text:"user query" AND role:"userRole" 
+0

回答ありがとうございます。しかし、それは助けにはなりません。問題は、私は記事ではなく、コメントで検索することです。 luceneインデックスでは、すべての記事にcomment.textとcomment.roleという複数のフィールドがありますが、特定のコメントからのcomment.textとcomment.roleは関連付けられていません。どうやって一緒に接着できますか? – rdk

0

joesliceの回答に追加してください。ロールへのアクセス権が階層内の他のロールへのアクセス権をカスケードする役割の階層がある場合。たとえば、ロール "manager"の許可が "director" & "vice president"の許可を得て付与された場合も同様です。この場合

、クエリが、私はこのような状況に何か良い解決策を考えることはできませんが、私はいくつかの悪いものを考え出すことができる

text:"user query" AND (role:"role1" OR role:"role2" OR role:"role3") 
0

になります...

問題luceneはドキュメントフィールドメカニズム以外の階層サポートを実際に提供していないということです。

あなたの最善の策は、すべてのコメントのために別々のドキュメントを作成することです。こうすることで、すべての文書に1つの「テキスト」と1つの「ロール」フィールドがあるため、そのロールがテキストに適用されることがわかります。

問題は、コメントと記事の間に良好な関連性がないためです。たとえば、単語 "lucene"を含むコメント付きの "hibernate"という単語を含む記事がある場合、検索"冬眠とルーネン"はそれを見つけることができません。あなたは記事とすべてのコメントをすべての文書の余分なフィールドとして含めることでこれを改善しようとすることができますが、本当に膨らんだインデックスとセキュリティの可能性があります。

これにアプローチする別の方法は、comment1,comment2などのような番号付きフィールドを持つことです。role1comment1を一致させることができます。記事に関するコメントが数多くある場合、クエリが大きく非効率的になります。