自建搜索引擎-基于美丽云

news2024/9/20 14:57:09

Meilisearch 是一个搜索引擎,主程序完全开源,除了使用官方提供的美丽云服务(收费)进行对接之外,还可以通过自建搜索引擎来实现完全独立的搜索服务。

由于成本问题,本博客采用自建的方式,本文就讲讲怎么搭建。

本文主要参考:

  • meilisearch 全接入指南 | 二丫讲梵:讲了怎么使用官方提供的服务,也讲了怎么自建
  • Meilisearch Documentation:官网文档

前置工作

  • 博客已配置 sitemap 功能,参考 VuePress 博客之 SEO 优化(一)之 sitemap 与搜索引擎收录 - 知乎
  • 自建时要用到自定义的域名,因此额外购买了一个二级域名的 SSL 证书,例如我用的是 search.peterjxl.com

安装和启动美丽云

首先需要在服务器上安装美丽云搜索:

curl -L https://install.meilisearch.com | sh

我在用 curl 安装的时候,发现有报错,推测是 GFW 的问题,改为用 Docker 安装(有很多安装方式,参考安装指南):

docker pull getmeili/meilisearch:v1.6

然后启动命令格式为:

docker run -itd --name meilisearch -p 7700:7700 \
  -e MEILI_ENV="production" -e MEILI_NO_ANALYTICS=true \
  -e MEILI_MASTER_KEY="自定义一个不少于16字节的秘钥" \
  -v $(pwd)/meili_data:/meili_data \
  getmeili/meilisearch:v1.6

注意修改 master-key,该密钥用于爬虫抓取使用(就是爬取你的博客内容并做好分词、索引等)。

启动后可以用 docker ps 查看容器状态,或者用 telnet 检查端口是否被监听。

配置 Nginx

首先去阿里云上配置 DNS 解析记录:

在这里插入图片描述

这个结合自身情况添加配置(例如我用的是 Nginx):

server {
		listen 80;
		listen 443 ssl;
		server_name search.peterjxl.com;

		ssl_certificate /conf/search.peterjxl.com.pem;
		ssl_certificate_key /conf/search.peterjxl.com.key;
		ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
		ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
		ssl_prefer_server_ciphers on;

		location / {
			proxy_set_header Host $host;
			proxy_set_header   X-Forwarded-Proto $scheme;
			proxy_set_header   X-Real-IP         $remote_addr;
			proxy_pass http://127.0.0.1:7700;
		}
	}

配置后记得重启 Nginx,并且记得开通防火墙,然后尝试访问子域名,可以看到正常转发了请求:

在这里插入图片描述

建立索引

接下来,我们通过美丽云提供的爬虫功能,将博客数据创建成索引,相关文档请见:Integrate a relevant search bar to your documentation — Meilisearch documentation。

其中,提供了一个关于 VuePress 的配置文件模板:

If you use VuePress for your documentation, you can check out the configuration file we use in production. In our case, the main container is theme-default-content​ and the selector titles and subtitles are h1​, h2​…

{
  "index_uid": "docs",
  "sitemap_urls": ["https://docs.meilisearch.com/sitemap.xml"],
  "start_urls": ["https://docs.meilisearch.com"],
  "selectors": {
    "lvl0": {
      "selector": ".sidebar-heading.open",
      "global": true,
      "default_value": "Documentation"
    },
    "lvl1": ".theme-default-content h1",
    "lvl2": ".theme-default-content h2",
    "lvl3": ".theme-default-content h3",
    "lvl4": ".theme-default-content h4",
    "lvl5": ".theme-default-content h5",
    "text": ".theme-default-content p, .theme-default-content li, .theme-default-content td"
  },
  "strip_chars": " .,;:#",
  "scrap_start_urls": true,
  "custom_settings": {
    "synonyms": {
      "relevancy": ["relevant", "relevance"],
      "relevant": ["relevancy", "relevance"],
      "relevance": ["relevancy", "relevant"]
    }
  }
}

注意如上的配置内容很重要,如果你的博客不是常规默认的,那么需要根据自己的情况对元素进行辨别,详细配置项说明,参考官方文档:更多可选字段 。

我用的配置如下:

{
    "index_uid": "VuePressBlog",
    "sitemap_urls": ["https://www.peterjxl.com/sitemap.xml"],
    "start_urls": ["https://www.peterjxl.com"],
    "selectors": {
        "lvl0": {
            "selector": "h1",
            "global": true,
            "default_value": "Documentation"
        },  
        "lvl1": ".theme-vdoing-content h2",
        "lvl2": ".theme-vdoing-content h3",
        "lvl3": ".theme-vdoing-content h4",
        "lvl4": ".theme-vdoing-content h5",
        "lvl5": ".theme-vdoing-content h6",
        "text": ".theme-vdoing-content p, .theme-vdoing-content li"
    },  
    "strip_chars": " .,;:#",
    "scrap_start_urls": true,
    "selectors_exclude": ["iframe", ".katex-block", ".md-flowchart", ".md-mermaid", ".md-presentation.reveal.reveal-viewport", ".line-numbers-mode", ".code
-group", ".footnotes", "footer.page-meta", ".page-nav", ".comments-wrapper"]

index_uid​ :为索引名称,如果服务端没有,则会自动创建。接下来我们将这个配置文件放到服务器上,然后通过如下命令运行爬虫对内容进行抓取(注意修改相关参数):

docker run -t --rm \
  --network=host \
  -e MEILISEARCH_HOST_URL='二级域名,例如我的是search.peterjxl.com' \
  -e MEILISEARCH_API_KEY='刚刚创建的Master Key' \
  -v 配置文件完整路径:/docs-scraper/config.json \
  getmeili/docs-scraper:v0.12.7 pipenv run ./docs_scraper config.json

执行过程中可以看到每个页面都进行了抓取(爬取过程会比较久,这取决于博客的内容数量):

在这里插入图片描述

创建搜索用的 key

在美丽云中,有两种密钥:

  • master-key:权限很大,例如创建,更新,删除索引。
  • API Key:权限很小,一般只用于搜索,可以有多个

更多说明可以参考官网文档:Master key and API keys — Meilisearch documentation。

由于 master-key 权限很大,不宜暴露,因此我们可以创建一个只有搜索权限的 API Key(用来搜索),命令格式:

curl \
  -X POST 'http://localhost:7700/keys' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 刚刚自定义的master-key' \
  --data-binary '{
    "description": "peterjxl.com search_key",
    "actions": ["search"],
    "indexes": ["刚刚创建的index_id"],
    "expiresAt": "2099-01-01T00:00:00Z"
  }'

然后会返回一串 JSON,其中的 key 就是我们需要的(已脱敏):

{
  "name": null,
  "description": "peterjxl.com search_key",
  "key": "xxxx",
  "uid": "xxxx",
  "actions": [
    "search"
  ],
  "indexes": [
    "wiki"
  ],
  "expiresAt": "2099-01-01T00:00:00Z",
  "createdAt": "2024-01-17T12:54:42.357819802Z",
  "updatedAt": "2024-01-17T12:54:42.357819802Z"
}

测试搜索

我们可以使用 Postman 来测试搜索效果(如果使用了美丽云的服务,可以在其官网进行搜索测试)

相关文档:Postman collection for Meilisearch — Meilisearch documentation (图片需科学上网后看到)

配置好后,可以进行搜索,效果如下:

在这里插入图片描述

配置 VuePress

接下来就是在 VuePress 中集成美丽云了。

客户端的配置相对简单,因为 meilisearch 的官方文档用的也是 Vuepress,因此官方也维护了一个 Vuepress 的插件,安装:

npm install vuepress-plugin-meilisearch

然后在配置插件的部分添加相关配置:

// 全文搜索插件 meilisearch
  [
    'vuepress-plugin-meilisearch',
      {
          hostUrl: 'https://search.peterjxl.com',        // meilisearch 服务端域名
          apiKey: "刚刚创建的搜索key", // 只有搜索权限的 key
          indexUid: 'VuePressBlog',
          placeholder: '支持全文搜索',           // 在搜索栏中显示的占位符
          maxSuggestions: 9,                      // 最多显示几个搜索结果
          cropLength: 30,                         // 每个搜索结果最多显示多少个字符
      },
  ],

然后本地运行,试试效果:

在这里插入图片描述

配置 GitHub Action

如果每次更新了博客,都重新运行建立索引的命令,也太麻烦了。我们可以脚本化,或者使用 GitHub Action。例如,添加如下配置:

  scrape-docs:
    needs: test_website
    runs-on: ubuntu-20.04
    steps:
        - uses: actions/checkout@v2
        - uses: actions/setup-node@v2
          with:
              node-version: 14
              registry-url: https://registry.npmjs.org/
        - name: Run docs-scraper
          env:
              API_KEY: ${{ secrets.MEILISEARCH_API_KEY }}
              CONFIG_FILE_PATH: ${{ github.workspace }}/docs/.vuepress/public/data/docs-scraper-config.json
          run: |
              docker run -t --rm \
                -e MEILISEARCH_HOST_URL="https://search.peterjxl.com" \
                -e MEILISEARCH_API_KEY=$API_KEY \
                -v $CONFIG_FILE_PATH:/docs-scraper/config.json \
                getmeili/docs-scraper:v0.12.7 pipenv run ./docs_scraper config.json

注意这 3 个配置:

  • secrets.MEILISEARCH_API_KEY​:就是 Master key
  • CONFIG_FILE_PATH​:爬虫抓取时的配置文件,可以选择放在项目源码的某个指定目录(例如我的是​ docs/.vuepress/config/​)
  • MEILISEARCH_HOST_URL​:美丽云的域名,例如我的是​ https://search.peterjxl.com

配置完后,当我们提交了新的代码,就会自动爬取博客数据并更新索引了,GitHub Action 执行情况:

在这里插入图片描述

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1916634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HybridCLR原理中的重点总结

序言 该文章以一个新手的身份,讲一下自己学习的经过,大家更快的学习HrbirdCLR。 我之前的两个Unity项目中,都使用到了热更新功能,而热更新的技术栈都是用的HybridCLR。 第一个项目本身虽然已经集成好了热更逻辑(使用…

【排序 - 冒泡排序】

当我们谈论经典的排序算法时,冒泡排序(Bubble Sort)往往是最先被提及的一种。尽管它在实际应用中不太常见,但冒泡排序的简单易懂,有助于理解排序算法的基本原理和思想。 冒泡排序的基本原理 冒泡排序是一种基础的交换…

Git的基本知识点 + GitBash安装Pacman + Git命令含有中文,终端输出中文乱码

Git的基本知识点:整理自以下作者的文章繁华似锦Fighting的文章https://www.jianshu.com/nb/49854893另外还补充了git ls-file、.gitignore 等内容,涉及具体操作,还有命令总结。简略版可以看以上作者的文章,详细版可以看网盘里面的…

【企业级监控】源码部署Zabbix与监控主机

Zabbix企业级分布式监控 文章目录 Zabbix企业级分布式监控资源列表基础环境一、LNMP环境搭建(在zbx主机上)1.1、配置Yum仓库1.1.1、下载阿里云的仓库文件1.2.2、安装PHP7的仓库1.2.3、生成Mariadb10.11的仓库文件1.2.4、快速重建Yum缓存 1.2、安装PHP7.4…

Golang | Leetcode Golang题解之第228题汇总区间

题目&#xff1a; 题解&#xff1a; func summaryRanges(nums []int) (ans []string) {for i, n : 0, len(nums); i < n; {left : ifor i; i < n && nums[i-1]1 nums[i]; i {}s : strconv.Itoa(nums[left])if left < i-1 {s "->" strconv.It…

数学建模美赛经验小结

图片资料来自网络所听讲座&#xff0c;感谢分享&#xff01;

《C++设计模式》状态模式

文章目录 一、前言二、实现一、UML类图二、实现 一、前言 状态模式理解最基本上的我觉得应该也是够用了&#xff0c;实际用的话&#xff0c;也应该用的是Boost.MSM状态机。 相关代码可以在这里&#xff0c;如有帮助给个star&#xff01;AidenYuanDev/design_patterns_in_mode…

Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce

章节内容 上节我们完成了&#xff1a; Sqoop 介绍Sqoop 下载配置环境等Sqoop 环境依赖&#xff1a;Hadoop、Hive、JDBC 等环境补全 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机…

javaweb图书商城系统带万字文档网上书城java项目java课程设计java毕业设计

文章目录 图书商城系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 图书商城系统 一、项目演示 网上书城 二、项目介绍 语言&#xff1a;java 数据库&#xff1a;…

如何用 Python 远程控制 Windows 服务器?

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 在信息时代的洪流中&#xff0c;掌握一门编程语言已经成为一项必备技能。Python&#xff0c;这门以简洁、易学、强大著称的编程语言&#xff0c;更是成为无数开发者的大宝剑。今天&…

maven——插件创建maven工程(了解即可)

对于之前手一个个文件夹创建&#xff0c;可能会觉得麻烦&#xff0c;maven出了个插件&#xff0c;可以直接创建出来。 使用这个指令就可以生成&#xff0c;是使用模板生成的&#xff0c;模板要告诉他用哪一个 告诉插件用的哪个模板&#xff1a; 范例&#xff1a; 创建java…

Nginx实现服务器端集群搭建/Nginx实现动静分离/Nginx高可用解决方案/Nginx与Tomcat部署

Nginx实现服务器端集群搭建 Nginx与Tomcat部署 前面课程已经将Nginx的大部分内容进行了讲解&#xff0c;我们都知道了Nginx在高并发场景和处理静态资源是非常高性能的&#xff0c;但是在实际项目中除了静态资源还有就是后台业务代码模块&#xff0c;一般后台业务都会被部署在…

Java-常用API

1-Java API &#xff1a; 指的就是 JDK 中提供的各种功能的 Java类。 2-Scanner基本使用 Scanner&#xff1a; 一个简单的文本扫描程序&#xff0c;可以获取基本类型数据和字符串数据 构造方法&#xff1a; Scanner(InputStream source)&#xff1a;创建 Scanner 对象 Sy…

Python地图可视化三大秘密武器

Python地图可视化库有大家熟知的pyecharts、plotly、folium&#xff0c;还有稍低调的bokeh、basemap、geopandas&#xff0c;也是地图可视化利器。 首先介绍下bokeh bokeh擅长制作交互式图表&#xff0c;当然在地图展示方面也毫不逊色。 Bokeh支持google地图、geojson数据的地…

枚举trick,CF 489D - Unbearable Controversy of Being

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 489D - Unbearable Controversy of Being 二、解题报告 1、思路分析 对于这种计算图形数目&#xff0c;最朴素的暴力无非是枚举每个顶点&#xff0c;这样时间复杂度会很高 策略往往是固定些点&#xff0c;…

在ROS (Robot Operating System) 中,查看话题(topics)

在ROS (Robot Operating System) 中&#xff0c;查看话题&#xff08;topics&#xff09;上发布的消息内容可以通过多种方式实现。以下是几种常用的方法&#xff1a; 1. 使用 rostopic echo 这是最直接的方式&#xff0c;可以用来实时显示话题上接收到的消息数据。命令格式如…

简单状压dp(以力扣464为例)

目录 1.状态压缩dp是啥&#xff1f; 2.题目分析 3.解题思路 4.算法分析 5.代码分析 6.代码一览 7.结语 1.状态压缩dp是啥&#xff1f; 顾名思义&#xff0c;状态压缩dp就是将原本会超出内存限制的存储改用更加有效的存储方式。简而言之&#xff0c;就是压缩dp的空间。 …

学习大数据DAY13 PLSQL基础语法2

目录 选择结构 IF语句 简单判断语句 带判断不成立语句 多判断语句 IF语句注意事项&#xff1a; CASE 语句 简单CASE语句 搜索型CASE语句 作业 循环语句 循环结构 简单循环 属性 描述 位置 场景 WHILE循环 属性 FOR循环 数值型for循环 数值型for循环的特性…

如何将若依vue升级到springboot3.x?

为了确保项目符合要求,Spring Boot 3.x 要求Java版本为17或更高。 1、修改根目录下的pom.xml文件 <!-- java.version版本8更换为17 --> <java.version>17</java.version><!-- 新增节点 --> <mybatis-spring-boot.version>3.0.3<

手撸俄罗斯方块(四)——渲染与交互

手撸俄罗斯方块&#xff08;四&#xff09;——渲染与交互 如何渲染游戏界面 我们知道&#xff0c;当我们看到页面先呈现图像时&#xff0c;实际上看到的是一张图片&#xff0c;多张图片按照一定的刷新频率进行切换&#xff0c;则变成了动态的视频。当刷新频率超过24Hz时&…