我正在定製Highlighter插件(使用FVH)來輸出給定搜索的查詢字詞的位置偏移量。到目前爲止,我已經能夠使用下面的代碼提取普通查詢的偏移量信息。然而,對於短語查詢,即使它不是短語查詢的一部分,代碼也會返回所有查詢詞的位置偏移量(即termSet)。因此,我想知道在Lucene中是否有方法僅使用FVH獲取短語查詢的匹配短語的偏移量信息?Lucene中短語查詢的位置偏移量
// 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 = 「真」,termPositions =「true」和termOffsets =「true」並且正在使用Lucene 3.1.0。
這是否也適用於MultiPhraseQuery? – Jahangir 2011-05-31 21:12:34
您必須知道哪些術語是變體(隱式「或」)以及哪些是匹配所需的。我會處理上述所需的條款;要處理變體(只有其中一個必須匹配),請更改spanContains()調用周圍的邏輯,該調用爲每個變體調用一次,並保持返回值接近所需的期限。 – 2011-06-01 01:04:16