我有一个特殊的问题(至少我认为是^^)。我希望我能描述我想要做的事情:
我有一组术语(字符串),每个术语也有一个分数(双精度)。现在我希望将这些术语与我的lucene索引中的文档进行匹配。
但我想考虑这些术语的所有可能组合。起初,我的想法是简单地构建一个巨人
`BooleanQuery: field1:term1 OR field1:term2 .... OR field2:term1 OR field2:term2 ...`但是,这个查询当然不会返回与为每个术语生成单独查询相同的结果:
`Query1: field1:term1 OR field2:term1 ...`
`Query2: field1:term2 OR field2:term2 ...`问题是,我的应用程序是一个ir应用程序,这些术语是自动生成/提取的,我不知道应该一起搜索哪些术语还是单独搜索更好。所以我想要“两全其美”。
有没有办法让一个查询来搜索我的术语列表的所有可能的组合?
当然,我可以做一些循环并为每种可能的组合生成一个查询,但这可能会永远运行下去……
希望你能理解我想要什么,并能帮助我:)谢谢!
发布于 2013-01-22 06:20:22
不太确定您想要的最终结果集是什么,但这里有几种可能性:
如果您只是希望任何搜索字段中的每个匹配项都与任一术语相匹配,那么:
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);发布于 2013-01-22 17:46:03
我不确定这是否有用,但您可以从所有字段中获取信息,并将其复制到另一个字段中。
我知道这是多余的,但是如果磁盘空间不是问题,那么运行查询可能会更方便,这样查询就变成了
aggr_field:(term1 OR term2 OR term3)https://stackoverflow.com/questions/14447514
复制相似问题