有了一个已经索引的文档,在搜索时我必须将该文档分成两部分:第一部分由前 100 个单词(标记)组成,文档的其余部分代表第二部分。我必须这样对这两部分进行评分:第二部分为 70%,第一部分为 30%。
编辑2:所以我尝试创建一个使用SpanPositionRangeQuery的搜索器,但我一定理解了SpanQuery的用法都是错误的,因为我无法得到任何命中(我使用lukeall来验证单词是否是我的)正在搜索并已编入索引)。有人可以帮我吗?
public static void search(String indexDir, String q) throws Exception
{
Directory dir = FSDirectory.open(new File(indexDir), null);
IndexSearcher is = new IndexSearcher(dir);
Term term = new Term("Field", q);
SpanPositionRangeQuery spanQuery = new SpanPositionRangeQuery(new SpanTermQuery(term), 0, 100);
spanQuery.setBoost(0.3f);CustomRomanianAnalyzer(Version.LUCENE_35));
long start = System.currentTimeMillis();
TopDocs hits = is.search(spanQuery, 10);
//TopDocs hits = is.search(query, 10);
long end = System.currentTimeMillis();
System.err.println("I found " + hits.totalHits + " documents (in " +
(end - start) + " milliseconds) '" +
q + "':");
for (int i=0;i<hits.scoreDocs.length;i++)
{
ScoreDoc scoreDoc = hits.scoreDocs[i];
Document doc = is.doc(scoreDoc.doc);
System.out.println(doc.get("filename"));
}
is.close();
}
我不知道如何将查询解析器与 SpanPositionRangeQuery 结合起来以获得我需要的...
最佳答案
是的,这可以通过为 BooleanQuery 中的每个子句设置提升来完成。使用单独的字段可以,但不是绝对必要的。 Lucene 有一个 SpanPositionRangeQuery适合搜索文档的一部分。
<SpanPositionRangeQuery: spanPosRange(field:term, 0, 100)^0.3>
关于java - lucene自定义评分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10608263/