From 6d41d90c576b4fe16e7edc1932caf7fe194daf68 Mon Sep 17 00:00:00 2001 From: okxlin Date: Thu, 10 Aug 2023 01:44:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0xunsearch=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/xunsearch/README.md | 69 +++++++++++++++++++++++ apps/xunsearch/data.yml | 20 +++++++ apps/xunsearch/latest/.env.sample | 4 ++ apps/xunsearch/latest/data.yml | 25 ++++++++ apps/xunsearch/latest/docker-compose.yml | 19 +++++++ apps/xunsearch/logo.png | Bin 0 -> 19916 bytes 6 files changed, 137 insertions(+) create mode 100644 apps/xunsearch/README.md create mode 100644 apps/xunsearch/data.yml create mode 100644 apps/xunsearch/latest/.env.sample create mode 100644 apps/xunsearch/latest/data.yml create mode 100644 apps/xunsearch/latest/docker-compose.yml create mode 100644 apps/xunsearch/logo.png diff --git a/apps/xunsearch/README.md b/apps/xunsearch/README.md new file mode 100644 index 00000000..63be075f --- /dev/null +++ b/apps/xunsearch/README.md @@ -0,0 +1,69 @@ +README of Xunsearch +=================== +$Id$ + +综述 +---- + +Xunsearch (中文名:迅搜)是一套免费开源的专业中文全文检索解决方案,简单易用而且 +功能强大、性能卓越能轻松处理海量数据的全文检索。它包含后端索引、搜索服务程序和前端 +脚本语言编写的开发包(称之为 SDK) 。前端和后端甚至可以分离部署在不同服务器中。一般 +开发者只要在安装和设置完成后,通过提供的 SDK 包进行较为容易的二次开发即可打造出自己 +的全文搜索引擎,适用于 MySQL 数据库全文检索、web站内/论坛搜索、行业门户/垂直搜索、 +文档/文献检索等各种领域。 + +Xunsearch 底层采用 C/C++ 编写,索引设计基于著名而悠久的 [Xapian][1],分词采用 +自主研发同样也是开源的 [SCWS分词][2],两者完美结合,理论上单个搜索库支持 40 亿条 +记录。可编译运行于 Linux/FreeBSD 等各种 UNIX 类型的系统。 + +Xunsearch devkit SDK 理论上支持各种包含 socket 实现的脚本语言,目前我们只提供 +PHP 的实现方式,其它脚本的 SDK 往后会陆续考虑和开发,也欢迎有能力开发的人加入或 +贡献相关代码。开发包代码可以运行于任何平台(包括 windows)。 + +Xunsearch 在确保高性能、全功能检索的基础上降低开发难度,支持字段检索、结果高亮、 +字段排序、布尔语法、区间检索、聚合搜索、相关搜索、权重微调、拼音搜索、搜索建议等 +专业搜索引擎具备的各项功能。 + +Xunsearch 全面开源,并使用最流行的开源许可协议 GPL 发布。您可以免费获取本项目的 +全部源代码,并在许可条件下修改和再分发,具体参见 [COPYING](COPYING) 文件。 + +请关注我们的官方网站: +在这里可以获取本项目的最新消息,和参与社区讨论和获得免费技术支持。 + + +安装、升级 +--------- + +请阅读 [README.install](https://github.com/hightman/xunsearch/blob/master/README.install) 文件 + + +SDK 开发文档 +----------- + +请阅读 [PHP-SDK 文档](https://github.com/hightman/xunsearch/blob/master/sdk/php/README.md) + + +架构说明 +------- + +请参看 [README.arch](https://github.com/hightman/xunsearch/blob/master/README.arch) + + +开源捐赠 +------- + +我们一直在努力,我们一直想做得更好,开源事业离不开大家的支持! +[捐赠我们](http://www.xunsearch.com/site/donate) + + +商业、其它技术支持 +---------------- + +为充分满足不同类型和层次的客户需求,我们在开源版本的基础上提供搜索相关的功能定制服务。 +我们的技术和经验积累将为您极大程度地节约开发成本和时间。 + +具体请访问我们的支持页面: + + +[1]: http://xapian.org/ +[2]: http://www.xunsearch.com/scws/ diff --git a/apps/xunsearch/data.yml b/apps/xunsearch/data.yml new file mode 100644 index 00000000..3dd40a32 --- /dev/null +++ b/apps/xunsearch/data.yml @@ -0,0 +1,20 @@ +name: 迅搜 Xunsearch +tags: + - 工具 +title: 一个高性能、全功能的全文检索解决方案 +type: 工具 +description: 一个高性能、全功能的全文检索解决方案 +additionalProperties: + key: xunsearch + name: 迅搜 Xunsearch + tags: + - Tool + shortDescZh: 一个高性能、全功能的全文检索解决方案 + shortDescEn: A high-performance, full-featured full-text search solution + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: http://www.xunsearch.com + github: https://github.com/hightman/xunsearch + document: http://www.xunsearch.com/doc/php \ No newline at end of file diff --git a/apps/xunsearch/latest/.env.sample b/apps/xunsearch/latest/.env.sample new file mode 100644 index 00000000..991577bb --- /dev/null +++ b/apps/xunsearch/latest/.env.sample @@ -0,0 +1,4 @@ +CONTAINER_NAME="xunsearch" +INDEX_SERVER_PORT="40110" +SEARCH_SERVER_PORT="40111" +DATA_PATH="./data" diff --git a/apps/xunsearch/latest/data.yml b/apps/xunsearch/latest/data.yml new file mode 100644 index 00000000..9a95418e --- /dev/null +++ b/apps/xunsearch/latest/data.yml @@ -0,0 +1,25 @@ +additionalProperties: + formFields: + - default: 40110 + edit: true + envKey: INDEX_SERVER_PORT + labelEn: Index server Port + labelZh: 索引服务端配置端口 + required: true + rule: paramPort + type: number + - default: 40111 + edit: true + envKey: SEARCH_SERVER_PORT + labelEn: Search server port + labelZh: 搜索服务端配置端口 + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text diff --git a/apps/xunsearch/latest/docker-compose.yml b/apps/xunsearch/latest/docker-compose.yml new file mode 100644 index 00000000..d30afb52 --- /dev/null +++ b/apps/xunsearch/latest/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' +services: + xunsearch: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${INDEX_SERVER_PORT}:8383" + - "${SEARCH_SERVER_PORT}:8384" + volumes: + - ${DATA_PATH}:/usr/local/xunsearch/data + image: hightman/xunsearch:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/xunsearch/logo.png b/apps/xunsearch/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..18f102e2cd218be689fcead72c6a688a4e420cb2 GIT binary patch literal 19916 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 Uu>R%pzdRej!~mvW19gk}A1JzlLI3~& literal 0 HcmV?d00001