必要な最終結果セットが何であるかはよくわかりませんが、いくつかの可能性があります。
いずれかの用語に対して検索フィールドのすべての一致が必要な場合は、次のようにします。
field1:term1 OR field1:term2 .... OR field2:term1 OR field2:term2 ...
または
field1:term1 field1:term2 .... field2:term1 field2:term2 ...
完全に適切です。
使用可能なすべての用語に少なくとも1つ一致する結果のみが必要であるが、検索されたフィールドが必要な場合は、次のようにクエリを構成できます。
+(field1:term1 field2:term1) +(field1:term2 field2:term2) ...
または、ここで検索するフィールドを1つの検索可能なフィールドにマージして、一緒に検索するのをはるかに簡単にすることもできます。ただし、これを実現するためのより良い方法であるかどうかは、アプリケーションによって異なります。
1つの用語が検索結果を支配しないようにクエリを調整する限り、次のようになります。
クエリを調整するための最初のステップは、特定の用語が結果を支配している理由を見つけることだと思います。その鍵となるのは、使用方法を学ぶことです:IndexSearcher.explain(query、doc)。これにより、ドキュメントのスコアリング方法が説明されます。Lukeは、インデックスに対してクエリを試行し、ドキュメントがスコアを取得する理由を確認するための優れたインターフェイスを提供します。
また、TFIDFSimilarityは、デフォルトでスコアを計算するDefaultSimilarityクラスの主要部分を文書化します。そこにあるドキュメントは、Luke / Explain(query、doc)に表示されるスコアリングパラメーターの特定の側面を理解するのに役立ちます。
問題についての私の最もよい推測は、あなたが複数の分野で同じ共通の用語にぶつかっているかもしれないということです。これにより、検索された各フィールドのその用語のスコアが複合され、1つのフィールドにのみ表示される用語の結果が消去される可能性があります(ただし、あなたの場合は同じように関連する可能性があります)。その場合、DisjunctionMaxQueryを使用して同じ用語を検索する複数のフィールドをラップすることで修正できます。
例えば:
BooleanQuery root = new BooleanQuery()
DisjunctionMaxQuery dismax1 = new DisjunctionMaxQuery(1.1);
dismax.add(new TermQuery(new Term("field1", "term1")));
dismax.add(new TermQuery(new Term("field2", "term1")));
//etc
root.add(dismax1, BooleanClause.occur.SHOULD);
DisjunctionMaxQuery dismax2 = new DisjunctionMaxQuery(1.1);
dismax.add(new TermQuery(new Term("field1", "term2")));
dismax.add(new TermQuery(new Term("field2", "term2")));
//etc
root.add(dismax2, BooleanClause.occur.SHOULD);