/* * Copyright (C) 2022, KylinSoft Co., Ltd. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authors: iaom * */ #include "basic-indexer.h" #include #include #include #include #include "file-utils.h" using namespace UkuiSearch; BasicIndexer::BasicIndexer(const QString& filePath): m_filePath(filePath) { } bool BasicIndexer::index() { QFileInfo info = QFileInfo(m_filePath); if(!info.exists()) { return false; } //添加数据 m_document.setData(m_filePath); //唯一term m_document.setUniqueTerm(FileUtils::makeDocUterm(m_filePath)); //上层文件夹term,用于在上层文件夹删除时删除自己 m_document.addTerm("PARENTTERM" + FileUtils::makeDocUterm(m_filePath.section("/", 0, -2, QString::SectionIncludeLeadingSep))); //1-目录, 0-文件 m_document.addValue(1, QString((info.isDir() && (!info.isSymLink())) ? "1" : "0")); //修改时间 QString time = info.lastModified().toString("yyyyMMddHHmmsszzz"); m_document.setIndexTime(time); m_document.addSortableSerialiseValue(2, time); QString indexName = info.fileName().toLower(); QStringList pinyinTextList = FileUtils::findMultiToneWords(info.fileName()); int i = 0; int postingCount = 1; //terms post of Xapian document is started from 1! int start = 0; QTextBoundaryFinder bf(QTextBoundaryFinder::Grapheme, indexName); for(; bf.position() != -1; bf.toNextBoundary()) { int end = bf.position(); if(bf.boundaryReasons() & QTextBoundaryFinder::EndOfItem) { m_document.addPosting(QUrl::toPercentEncoding(indexName.mid(start, end - start)).toStdString(), postingCount); ++postingCount; } start = end; } for(QString& s : pinyinTextList) { i = 0; while(i < s.size()) { m_document.addPosting(QUrl::toPercentEncoding(s.at(i)).toStdString(), postingCount); ++postingCount; ++i; } } return true; }