假设你有一张mysql表:
title content url
存储了数百篇文档。
整个表包括如下数据:
title | content | url |
---|---|---|
api网关开发综述 | api网关系统包括以下几个子项目,其中server使用beego框架,xxx……..其中设计到一些技术:包括beego、 docker ….项目目前部署在华为云服务器。 | http://localhost/use-docker |
通过appkey调用api | 这个项目是刘潇涵开发的,是为了方便网关中调用api测试而开发的。完成后使用了docker部署 | http://localhost/api-caller |
子项目1 | 这个项目xxx。项目根目录有一个 docker file,可以用来构建镜像….此外,部署 脚本也在根目录 | http://localhost/1 |
子项目2 | 这个项目xxx。也可以使用 docker 来 部署 | http://localhost/2 |
子项目3 | 这个项目xxx。…某些无关内容… 部署 …其他内容 | http://localhost/3 |
… | … | … |
docker的安装、使用和部署 | 首先需要上docker官网下载docker程序,然后编写dockerfile,最终部署时使用如下命令:xxx | http://localhost/use-docker |
子项目12 | 这个项目xxx。 …某些无关内容… 部署 …其他内容 | http://localhost/12 |
现在:
用户输入: docker 部署
检索输: ?
用户其实想要的是docker部署的通用流程,想获得的是《docker的安装、使用和部署》这篇文章。于是我们通过如下sql语句从数据库模糊匹配:
select * from table where title like %docker% or content like %部署%
or content like %docker% or content like %部署%
返回了上表中所有的文档。而且没有做排序。
由于问答接口限制,你只返回了前10个文档,并可以展开显示其余文档链接:
用户输入: docker 部署
检索输: “docker 部署”的相关文档较多,有如下文档:
api网关开发综述 http://localhost/use-docker
通过appkey调用api http://localhost/api-caller
子项目1 http://localhost/1
子项目2 http://localhost/2
......
......
子项目7 http://localhost/7
更多结果,你可以点击此处展开:
子项目8 http://localhost/8
......
......
docker的安装、使用和部署 http://localhost/use-docker
子项目12 http://localhost/12
其中用户真正想要的 docker 部署 的相关文档:《docker的安装、使用和部署》 被排在了倒数第二个(由于数据库里存入时间的问题)。 用户一看就很懵逼,检索效果太差,得翻半天才能找到想要的结果。
因此,一个能用的检索系统一定得有排序。
至于怎么排序,有很多排序算法。排序算法一般会考虑如下因素:
- 匹配的到检索词的覆盖度。就是说用户输入“docker 部署”,检索出的结果最好两个词都包含。
- 匹配的词在文档中的出现数目。就是说,文档中出现 docker 或者 部署 次数更多的文章应该更加优先。
- 匹配词的权重。譬如 docker的权重在这里应该比部署权重更高,即使找到和docker相关的,没提到部署,也比只找到了部署,没找到docker的文章更好。
- 段落权重。譬如标题中出现docker 部署,肯定比文章中出现docker、部署更加可靠。
还有很多因素,排序算法就是要考虑如上因素,做出合理的排序。