parent
b9c6ad2842
commit
63b5aa9412
@ -0,0 +1,64 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <xapian.h>
|
||||||
|
#include <cppjieba/Jieba.hpp>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
struct SearchResult {
|
||||||
|
std::string path;
|
||||||
|
std::string snippet;
|
||||||
|
std::vector<size_t> positions;
|
||||||
|
double score;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SearchEngine {
|
||||||
|
public:
|
||||||
|
SearchEngine(const std::string& db_path);
|
||||||
|
~SearchEngine();
|
||||||
|
|
||||||
|
// 添加文档到索引
|
||||||
|
void addDocument(const std::string& path, const std::string& content);
|
||||||
|
|
||||||
|
// 搜索文档
|
||||||
|
std::vector<SearchResult> search(const std::string& query, size_t limit = 10);
|
||||||
|
|
||||||
|
// 提交更改
|
||||||
|
void commit();
|
||||||
|
|
||||||
|
enum class SortField {
|
||||||
|
RELEVANCE,
|
||||||
|
PATH,
|
||||||
|
SIZE,
|
||||||
|
MODIFIED_TIME
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class SortOrder {
|
||||||
|
ASC,
|
||||||
|
DESC
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SearchOptions {
|
||||||
|
size_t limit = 10;
|
||||||
|
size_t offset = 0;
|
||||||
|
SortField sort_field = SortField::RELEVANCE;
|
||||||
|
SortOrder sort_order = SortOrder::DESC;
|
||||||
|
std::string file_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<SearchResult> search(
|
||||||
|
const std::string& query,
|
||||||
|
const SearchOptions& options
|
||||||
|
);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<Xapian::WritableDatabase> db_;
|
||||||
|
std::unique_ptr<Xapian::TermGenerator> term_gen_;
|
||||||
|
std::unique_ptr<cppjieba::Jieba> jieba_;
|
||||||
|
|
||||||
|
// 分词处理
|
||||||
|
std::string tokenize(const std::string& text);
|
||||||
|
|
||||||
|
// 获取高亮片段
|
||||||
|
std::string getSnippet(const std::string& content, const std::string& query);
|
||||||
|
};
|
Loading…
Reference in new issue