clucene可以通过TermDocs(SegmentTermDocs)和TermPositions(SegmentTermPositions)的文档信息和位置信息.
可以用此些类自己做高亮
void FindTermPosition( IndexReader* pReader, IndexSearcher* pSearcher,
TCHAR* txt , TCHAR* field /*,
CEdit* pedit*/ )
{
assert( txt != NULL && pReader != NULL && pSearcher != NULL );
if( NULL == txt || NULL == pReader || NULL == pSearcher )
return;
Term* pTerm = _CLNEW Term( field, txt );
assert(NULL != pTerm);
if(NULL == pTerm)
return ;
Query* pQuery = _CLNEW TermQuery( pTerm );
assert(NULL != pQuery);
if(NULL == pQuery)
{
_CLDELETE(pTerm);
return ;
}
Hits* pHits = pSearcher->search( pQuery );
assert(NULL != pHits);
if(NULL == pHits)
{
_CLDELETE(pTerm);
_CLDELETE(pQuery);
return ;
}
int len = pHits->length();
if( len <= 0)
return;
int32_t* docs = new int32_t[ len ];
int32_t* freqs = new int32_t[ len ];
assert( ( freqs != NULL ) &&
( docs != NULL ) );
if(( NULL == freqs ) ||
( NULL == docs ))
return;
int** pos = new int*[ len ];
memset( docs, 0, sizeof( int32_t ) * ( len ) );
memset( freqs, 0, sizeof( int32_t ) * ( len ) );
TermDocs* td = pReader -> termDocs( pTerm );
td->read( docs, freqs, len ); // 读取命中文档及其关键字词频;
TermPositions* tp = pReader->termPositions( pTerm );
int32_t i = 0;
int32_t j = 0;
//////////////////////////////////////////
char strDest[ 250 ];
//sprintf( strDest, "------------------------------/n" );
//ShowMessage( strDest , pedit );
//sprintf( strDest, "当前关键字: %s/n", buf );
//ShowMessage( strDest , pedit );
/*********************/
// 一共有多少的关键字
// 关键字的位置
/*********************/
while ( tp->next() ) // 遍历位置;
{
int32_t freq = freqs[ i ];
//sprintf( strDest, "在文档%d中共有%d个词与关键词匹配/n", i, freq );
//ShowMessage( strDest , pedit );
pos[ i ] = new int32_t[ freq ]; // 按词频创建数组;
for ( j = 0; j < freq; j++ )
{
pos[ i ][ j ] = tp->nextPosition();
if( j == 0 )
{
//sprintf( strDest, "关键字首次出现于第%d个位置/n", pos[ i ][ j ] );
//ShowMessage( strDest , pedit );
}
else if( j == ( freq - 1 ) )
{
//sprintf( strDest, "关键字最后出现于第%d个位置/n", pos[ i ][ j ] );
//ShowMessage( strDest , pedit );
}
}
i++;
}
//sprintf( strDest, "------------------------------/n" );
//ShowMessage( strDest , pedit );
for( i = 0; i < len ; i++ )
delete[] pos[ i ];
delete[] pos;
delete[] freqs;
delete[] docs;
freqs = NULL;
docs = NULL;
pos = NULL;
_CLDELETE_ARRAY(tp);
_CLVDELETE(td);
_CLDELETE( pHits );
_CLDELETE( pQuery );
_CLDELETE( pTerm );
}