clucene的位置信息

 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 );

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值