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.
mabbs/_posts/2021-07-23-search.md

26 lines
4.2 KiB

---
layout: post
title: 如何给博客加上全文搜索功能
tags: [搜索, 博客, 全文]
---
原来JavaScript比Java还难<!--more-->
# 起因
前两天,我在看群的时候看到了[其他人的博客](https://github.com/TMaize/tmaize-blog),打开随便看了两眼莫名其妙的就点到搜索页面上了,随手一输那个效果想不到还不错,有那个全文搜索功能。
其实我之前也想搞全文搜索,但是作为静态博客,全文搜索意味着客户端要遍历所有的文章,想想好像挺耗时就没搞。但是再想想我写几百万字可能还没有一张图片大,似乎对用户体验也不会有特别大的影响,而且最主要的是我之前博客用的那个[破烂玩意](https://github.com/androiddevelop/jekyll-search)它需要调用bootstrap库这库大也就算了但是bootstarp的样式表会影响我博客的效果我给那个插件作者[反馈](https://github.com/androiddevelop/jekyll-search/issues/7)之后人家完全不在乎。行吧,开源作者有这个权利,那我只好换一家了。
# 痛苦的写代码时间
我最开始是想用那个最开始看到的那个博客上的代码然后随便改改用,但是那个代码的耦合性太高了,我也不想整些太多余的代码,我是拆了半天没拆出来之后我就放弃了,从网上搜搜看有没有更合适的。 ~~自己写那是不可能的我哪会JS啊😂~~
后来我找到了[Simple-Jekyll-Search](https://github.com/christian-fei/Simple-Jekyll-Search)这个项目看起来好像还挺简单的实际试了一下也挺简单的而且还支持全文搜索可惜就是不能高亮被搜索词。按它的说明用确实挺不错不过我的博客结构如果加搜索的话如果单独设置成一个超链接到单独的页面实在是太不明显了后来我想了想干脆还是设置成搜索框吧到时候用URL参数把内容传过去搜索也算是挺方便的。但是有个很严重的问题就是这个库搜索要么就是键盘输入触发要么就是用它带的search方法触发。最开始我还没看见那个search方法想了半天想不出来怎么才能触发搜索后来倒是看见了那个方法不过还是有很大的问题那就是我的代码肯定是在页面加载时运行的但是那个插件搜索前需要把我全文的内容加载进来。这个加载需要时间而且还是异步的这就导致我根本不知道那个方法什么时候可以使用。如果在它加载完成之前调用就搜索不到内容这就很令人伤脑筋……就这个东西让我改代码[改了几十次](https://github.com/Mabbs/mabbs.github.io/commits/master/search.html)看文档倒是说它加载完成时可以用success设置一个回调函数然而实际上那是个假的选项我试了一下就算是数据没有载入完它也会执行回调函数这搞得我实在是没办法说实话我JS的水平真的不太行主要是JS的语法真的是很有特色和其他语言都不一样而且作为可以操作HTML的语言还有那个异步都注定它与其他语言是不一样的。总之新手还是别学JS了学PHP都比JS好。
# 突发奇想的解决
之后我又看了半天并研究了一下那个插件的源代码不管咋样目前问题看起来就是出在AJAX的异步上了而且最重要的是回调函数是假的那我看算了我不用这个垃圾插件的AJAX了我用jQuery的AJAX它不香吗所以我就用jQuery来加载我博客的全文内容最终可算是解决了问题。
# 最终的代码
搜索引擎的代码 `search.html` <https://github.com/Mabbs/mabbs.github.io/blob/master/search.html>
全文索引的代码 `search.json` <https://github.com/Mabbs/mabbs.github.io/blob/master/search.json>
# 后记
感觉这个问题真的是在我所有学习的编程语言中解决最曲折的了主要还有一个问题就是网上的教程好多都是完全没用的东西真的中文互联网根本学不成编程全都是垃圾在垃圾堆里找点可能有点用的东西结果还是啥烟雾弹虽然我很看好前端但是JS真的是把我整恶心了。