假设有一个交友网站,信息表以下:数据库
美女1:“我要找在上海作 PHP 的哥哥。”架构
须要匹配 性别、城市、语言列。框架
美女2:“我要找北京的爱旅游、爱漂亮食的 JAVA 哥哥。”分布式
更复杂了是吧,实际场景中,会有更复杂的排列组合。网站
对于这类的搜索,关系型数据库的索引就很难应付了,适合使用全文搜索的倒排索引。spa
倒排索引是一种数据库的索引形式,存储了 “内容 -> 文档” 映射关系,目的是快速的进行全文搜索。3d
主要包括2个过程:blog
举个例子,有2个文档:索引
“ Recipe of pasta with sauce pesto”
“ Recipe of delicious carbonara pasta”
先对文档进行分词,造成一个个的 token,也就是 单词,而后保存这些 token 与文档的对应关系。token
结果以下:
搜索示例:
先分词,获得2个 token,( “pasta”、“recipe” )。
而后去倒排索引中进行匹配。
这2个词在2个文档中都匹配,因此2个文档都会返回,并且分数相同。
一样,2个文档都匹配,都会返回。
此次 document#2 的分数要比 document#1 高。
由于 #2 匹配了2个词(“carbonara”、“pasta”),#1 只匹配了一个(“pasta”)。
有时咱们能够在保存和搜索以前对 token 进行一些转换,最广泛的例如:
中止词是那些使用量很是大,但又没有什么意义的词。
例如英文中的 “of”, “the”, “for” ……
把单词处理为字典中的标准词,例如:
“running” => “run”
“walks” => “walk”
“thought” =>“think”
经过切断词尾将一个词转换成词根形式的过程。
不能处理不规则动词的状况,但能够处理字典中没有的词。
推荐阅读: