假设你有一张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、部署更加可靠。

还有很多因素,排序算法就是要考虑如上因素,做出合理的排序。