跳到主要内容

为博客添加搜索引擎

· 阅读需 3 分钟
阅读量: 101
阅读人次: 102

一直在尝试各种不同的文本搜索引擎,是为了给博客添加一个搜索栏。

Algolia DocSearch

在使用上 Algolia DocSearch 是使用体验最好的,也是 Docusaurus 官方支持的,但是其不开源,但可以免费使用。

参考文章:

首先在 Algolia 免费创建 Applicaiton,跳过 Get Started

Data sources 找到 Crawler,先按照提示验证域名。然后添加 Crawler,选择 Technical documentation,再选择 Docusaurus v2.x or v3.x 作为模板。

创建完成之后,在 SETUPConfiguration 下关闭 Max URLs

然后开始爬取网站内容,爬取完成之后,Crawler 的名字就会作为一个 index。安装提示填入 Docusaurus 即可。

Algolia 限制了免费版的 Records 数量,免费版只有10K,实测某些 url 已经超出其限制,Algolia 选择直接跳过该 url 的爬取。

Typesense 作为 Algolia 的开源平替版,和 Docusaurus 集成度也还行,轻量简单易于本地部署。但是目前发现它对中文分词好像不太友好,没有 Meilisearch 好。

Meilisearch 对中文支持稍微友好一点。

Meilisearch

使用 Docker 部署Meilisearch,meilisearch-docsearch 替换 Docusaurus 的 SearchBar(可以参考 tauri-docs)。为网址添加搜索栏

# 生成 --master-key
docker run -it --rm --name meilisearch \
-p 7700:7700 \
-v /mnt/user/appdata/meilisearch:/meili_data \
getmeili/meilisearch:v1.15.0

docker run -d --name meilisearch --restart=unless-stopped \
-e TZ="Asia/Shanghai" \
-p 7700:7700 \
-v /mnt/user/appdata/meilisearch:/meili_data \
getmeili/meilisearch:v1.15.0 \
meilisearch --master-key=your_master_key

docker run -t --rm \
--network=host \
-e MEILISEARCH_HOST_URL='http://localhost:7700' \
-e MEILISEARCH_API_KEY='your_master_key' \
-v /mnt/user/appdata/meilisearch/meilisearch.json:/docs-scraper/config.json \
getmeili/docs-scraper:latest pipenv run ./docs_scraper config.json

curl -X GET 'http://localhost:7700/keys' \
-H 'Authorization: Bearer your_master_key'

Typesense

mkdir $(pwd)/typesense-data
docker run -d --restart unless-stopped --name typesense -p 8108:8108 -v$(pwd)/typesense-data:/data typesense/typesense:26.0 --data-dir /data --api-key="amass_toolset" --enable-cors

安装 DocSearch Scraper

编写配置文件 typesense.json

{
"index_name": "amass_blog",
"start_urls": [
"https://amass.fun/"
],
"sitemap_urls": [
"https://amass.fun/sitemap.xml"
],
"sitemap_alternate_links": true,
"stop_urls": [],
"selectors": {
"lvl0": {
"selector": "(//ul[contains(@class,'menu__list')]//a[contains(@class, 'menu__link menu__link--sublist menu__link--active')]/text() | //nav[contains(@class, 'navbar')]//a[contains(@class, 'navbar__link--active')]/text())[last()]",
"type": "xpath",
"global": true,
"default_value": "Documentation"
},
"lvl1": "header h1",
"lvl2": "article h2",
"lvl3": "article h3",
"lvl4": "article h4",
"lvl5": "article h5, article td:first-child",
"lvl6": "article h6",
"text": "article p, article li, article td:last-child"
},
"strip_chars": " .,;:#",
"custom_settings": {
"separatorsToIndex": "_",
"attributesForFaceting": [
"language",
"version",
"type",
"docusaurus_tag"
],
"attributesToRetrieve": [
"hierarchy",
"content",
"anchor",
"url",
"url_without_anchor",
"type"
]
},
"conversation_id": [
"833762294"
],
"nb_hits": 46250
}

创建 .env 文件

TYPESENSE_API_KEY=amass_toolset
TYPESENSE_HOST=amass.fun
TYPESENSE_PORT=8108
TYPESENSE_PROTOCOL=http

运行scraper

docker run -it --rm --env-file=$(pwd)/typesense-data/.env -e "CONFIG=$(cat $(pwd)/typesense-data/typesense.json | jq -r tostring)" typesense/docsearch-scraper:0.9.1