You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.5 KiB
75 lines
2.5 KiB
#include "search_engine.h"
|
|
#include <httplib.h>
|
|
#include <nlohmann/json.hpp>
|
|
#include <filesystem>
|
|
#include "file_monitor.h"
|
|
|
|
using json = nlohmann::json;
|
|
|
|
int main() {
|
|
SearchEngine engine("./search_db");
|
|
|
|
// 启动文件监控
|
|
FileMonitor monitor("./docs", [&](const std::string& path, const std::string& content) {
|
|
engine.addDocument(path, content);
|
|
engine.commit();
|
|
});
|
|
monitor.start();
|
|
|
|
httplib::Server svr;
|
|
|
|
// 更新搜索接口
|
|
svr.Get("/search", [&](const httplib::Request& req, httplib::Response& res) {
|
|
auto query = req.get_param_value("q");
|
|
auto limit_str = req.get_param_value("limit", "10");
|
|
auto offset_str = req.get_param_value("offset", "0");
|
|
auto sort_field = req.get_param_value("sort", "relevance");
|
|
auto sort_order = req.get_param_value("order", "desc");
|
|
auto file_type = req.get_param_value("type", "");
|
|
|
|
SearchOptions options;
|
|
options.limit = std::stoul(limit_str);
|
|
options.offset = std::stoul(offset_str);
|
|
options.file_type = file_type;
|
|
|
|
// 设置排序选项
|
|
if (sort_field == "path")
|
|
options.sort_field = SortField::PATH;
|
|
else if (sort_field == "size")
|
|
options.sort_field = SortField::SIZE;
|
|
else if (sort_field == "modified")
|
|
options.sort_field = SortField::MODIFIED_TIME;
|
|
|
|
options.sort_order = (sort_order == "desc") ?
|
|
SortOrder::DESC : SortOrder::ASC;
|
|
|
|
auto results = engine.search(query, options);
|
|
|
|
json response = json::array();
|
|
for (const auto& result : results) {
|
|
response.push_back({
|
|
{"path", result.path},
|
|
{"snippet", result.snippet},
|
|
{"score", result.score},
|
|
{"positions", result.positions}
|
|
});
|
|
}
|
|
|
|
res.set_content(response.dump(), "application/json");
|
|
});
|
|
|
|
// 索引接口
|
|
svr.Post("/index", [&](const httplib::Request& req, httplib::Response& res) {
|
|
auto j = json::parse(req.body);
|
|
std::string path = j["path"];
|
|
std::string content = j["content"];
|
|
|
|
engine.addDocument(path, content);
|
|
engine.commit();
|
|
|
|
res.set_content("{\"status\":\"ok\"}", "application/json");
|
|
});
|
|
|
|
svr.listen("localhost", 3000);
|
|
return 0;
|
|
}
|