不太确定您想要的最终结果集是什么,但这里有几种可能性:
如果您只是希望任何搜索字段中的每个匹配项都与任一术语匹配,那么:
field1:term1 OR field1:term2 .... OR field2:term1 OR field2:term2 ...
或者
field1:term1 field1:term2 .... field2:term1 field2:term2 ...
完全足够了。
如果您只想要在所有可用术语上至少有一个匹配项但在任何搜索字段中的结果,那么您可以像这样构造查询:
+(field1:term1 field2:term1) +(field1:term2 field2:term2) ...
或者,您可以将要在此处搜索的字段合并为一个可搜索的字段,使它们更容易一起搜索。不过,这是否是实现此目的的更好方法取决于您的应用程序。
至于调整您的查询以防止一个词支配您的搜索结果:
我认为调整查询的第一步是找出为什么某些术语会主导您的结果。关键是学习使用:IndexSearcher.explain(query,doc)。这将解释文档是如何评分的。Luke 提供了一个很好的界面来尝试对索引进行查询,并查看文档为什么会得到它们所做的分数。
此外,TFIDFSimilarity记录了默认计算分数的 DefaultSimilarity 类的主要部分。那里的文档将有助于理解 Luke/explain(query,doc) 中显示的评分参数的某些方面。
我对这个问题的最佳猜测是,您可能会在多个领域使用相同的常用术语。这将复合该术语在其所在的每个字段中的分数,并且可以消除仅出现在一个字段中的术语的结果(但在您的情况下可能同样相关)。在这种情况下,您可以通过使用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);