我正在定制荧光笔插件(使用 FVH)以输出给定搜索的查询词的位置偏移量。到目前为止,我已经能够使用下面的代码提取正常查询的偏移信息。但是,对于 Phrase 查询,即使它不是 Phrase 查询的一部分,代码也会返回所有查询术语(即 termSet)的位置偏移量。因此,我想知道 Lucene 中是否有一种方法可以仅获取使用 FVH 进行短语查询的匹配短语的偏移量信息?
// In DefaultSolrHighlighter.java::doHighlightingByFastVectorHighlighter()
SolrIndexSearcher searcher = req.getSearcher();
TermFreqVector[] tvector = searcher.getReader().getTermFreqVectors(docId);
TermPositionVector tvposition = (TermPositionVector) tvector[0];
Set<String> termSet = highlighter.getHitTermSet (fieldQuery, fieldName);
int[] positions;
List hitOffsetPositions = new ArrayList<String[]>();
for (String term : termSet)
{
int index = tvposition.indexOf(term);
positions = tvposition.getTermPositions(index);
StringBuilder sb = new StringBuilder();
for (int pos : positions)
{
if (!Integer.toString(pos).isEmpty())
sb.append( pos ).append(',');
}
hitOffsetPositions.add(sb.substring(0, sb.length() - 1).toString());
}
if( snippets != null && snippets.length > 0 )
{
docSummaries.add( fieldName, snippets );
docSummaries.add( "hitOffsetPositions", hitOffsetPositions);
}
// In FastVectorHighlighter.java
// Wrapper function to get query Terms
public Set<String> getHitTermSet (FieldQuery fieldQuery, String fieldName)
{
Set<String> termSet = fieldQuery.getTermSet( fieldName );
return termSet;
}
电流输出:
<lst name="6H500F0">
<arr name="name">
<str> New <em>hard drive</em> 500 GB SATA-300 and old drive 200 GB</str>
</arr>
<arr name="hitOffsetPositions">
<str>2</str>
<str>3</str>
<str>10</str>
</arr>
预期输出:
<lst name="6H500F0">
<arr name="name">
<str> New <em>hard drive</em> 500 GB SATA-300 and old drive 200 GB</str>
</arr>
<arr name="hitOffsetPositions">
<str>2</str>
<str>3</str>
</arr>
我要强调的字段有termVectors="true"、termPositions="true"和termOffsets="true"并且正在使用 Lucene 3.1.0。