Merge pull request #960 from xiaoyifang/opt/slob-fulltext-creation

opt: boost slob fulltext speed
This commit is contained in:
xiaoyifang 2023-07-13 14:16:35 +08:00 committed by GitHub
commit 2b1d91638e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -584,6 +584,8 @@ class SlobDictionary: public BtreeIndexing::BtreeDictionary
SlobFile sf;
QString texCgiPath, texCachePath;
string idxFileName;
public:
SlobDictionary( string const & id, string const & indexFile, vector< string > const & dictionaryFiles );
@ -662,10 +664,9 @@ private:
friend class SlobResourceRequest;
};
SlobDictionary::SlobDictionary( string const & id,
string const & indexFile,
vector< string > const & dictionaryFiles ):
SlobDictionary::SlobDictionary( string const & id, string const & indexFile, vector< string > const & dictionaryFiles ):
BtreeDictionary( id, dictionaryFiles ),
idxFileName( indexFile ),
idx( indexFile, "rb" ),
idxHeader( idx.read< IdxHeader >() )
{
@ -1088,26 +1089,7 @@ quint64 SlobDictionary::getArticlePos( uint32_t articleNumber )
void SlobDictionary::sortArticlesOffsetsForFTS( QVector< uint32_t > & offsets, QAtomicInt & isCancelled )
{
QVector< uint32_t > newOffsets;
newOffsets.reserve( offsets.size() );
{
QMutexLocker _( &slobMutex );
SlobFile::RefOffsetsVector const & sortedOffsets = sf.getSortedRefOffsets();
qint32 entries = sf.getRefsCount();
for ( qint32 i = 0; i < entries; i++ ) {
if ( Utils::AtomicInt::loadAcquire( isCancelled ) )
throw exUserAbort();
if ( offsets.contains( sortedOffsets[ i ].second ) )
newOffsets.append( sortedOffsets[ i ].second );
}
}
offsets.reserve( newOffsets.size() );
for ( int i = 0; i < newOffsets.size(); i++ )
offsets[ i ] = newOffsets.at( i );
//Currently , we use xapian to create the fulltext index. The order of offsets is no important.
}
void SlobDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration )
@ -1130,7 +1112,8 @@ void SlobDictionary::makeFTSIndex( QAtomicInt & isCancelled, bool firstIteration
try
{
FtsHelpers::makeFTSIndex( this, isCancelled );
const auto slob_dic = std::make_unique< SlobDictionary >( getId(), idxFileName, getDictionaryFilenames() );
FtsHelpers::makeFTSIndex( slob_dic.get(), isCancelled );
FTS_index_completed.ref();
}
catch( std::exception &ex )