From 35ebaa52b63c9fe20936d63ddaf53a79dd5a3813 Mon Sep 17 00:00:00 2001 From: pr4ku3p2c <925473174@qq.com> Date: Mon, 20 Jan 2025 18:07:43 +0800 Subject: [PATCH] ADD file via upload --- main.cpp | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 main.cpp diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..75427e6 --- /dev/null +++ b/main.cpp @@ -0,0 +1,75 @@ +#include "search_engine.h" +#include +#include +#include +#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; +} \ No newline at end of file