[TOC]html
本文为阅读《这就是搜索引擎:核心技术详解》的读书笔记java
搜索引擎是互联网重要的组成部分,搜索引擎技术也是当前解决信息过载问题主要的手段git
能够按照使用的技术将搜索引擎的发展分为四个阶段:github
iphone 11
搜索引擎的目标是:更全、更快、更准web
所谓的暗网指的是那些存储在数据库里,不能经过超连接访问的资源集合。简单点说所谓的暗网就是不能或者很难被搜索引擎收录的网络资源。携程的机票数据须要经过组合的方式才能查询出来,对于网络爬虫而言这个过程难以实现自动化,普通的暴力抓取将对被抓网站带来较大的压力并且效率很是低下算法
暗网爬虫的技术难点有两个:数据库
上面两个技术难点有部分解决方案,能够参考《这就是搜索引擎》的第 2.6 节windows
索引是搜索引擎的核心技术之一,是搜索引擎快速查找的基础服务器
单词文档矩阵用来表示某一个文档中是否存在某一个单词,例如:restful
文档 1 | 文档 2 | ... | 文档 n | |
---|---|---|---|---|
词汇 1 | 包含 | 不包含 | ||
... | ... | ... | ... | ... |
词汇 n | 包含 | ... |
在英文的行文中,单词之间是以空格做为天然分界符的,而中文只有字、句和段能经过明显的分界符来简单划界,而词没有一个形式上的分界符,分词处理就是将连续的字序列按照必定的规范从新组合成词序列的过程
单词是搜索引擎的基本搜索元素,为了建立单词文档矩阵,须要先使用分词系统提取文档中全部的单词
文档的分词处理是天然语言处理(NLP)的核心工具之一,而 NLP 则是大数据时代极为重要的工具。本文不对分词算法作介绍,详细信息能够参考其余文档
文档编号 | 文档内容 |
---|---|
1 | 谷歌地图之父跳槽Facebook |
2 | 谷歌地图之父加盟Facebook |
3 | 谷歌地图创始人拉斯离开谷歌加盟Facebook |
4 | 谷歌地图之父跳槽Facebook与Wave项目取消有关 |
5 | 谷歌地图之父拉斯加盟社交网站Facebook |
单词 ID | 单词 | 文档频率 | 倒排列表(文档编号、词频、位置) |
---|---|---|---|
1 | 谷歌 | 5 | (1;1;<1>),(2;1;<1>),(3;2;<1;6>),(4;1;<1>),(5;1;<1>) |
2 | 创始人 | 1 | (3;1;<3>) |
... | ... | ... | ... |
单词“谷歌”出如今了 5 个文档中,而且在第三个文档中出现了 2 次,分别在文档第一个单词处和第 6 个单词处
常见的索引创建方法有三种:两遍文档法、排序法和归并法,比较经常使用的是归并算法
在数据量大到不能使用内存存储时只能使用外排算法:归并
搜索动态变化的文档集合时须要建立动态索引,此时系统中有三个关键部分:倒排索引、临时索引和已删除文档列表
变化的文档会先创建临时索引。文档的更新按照删除&从新添加进行处理,删除的文档须要在删除文档列表中进行维护,返回查询结果时须要使用删除文档列表过滤查询结果。
索引更新有多种策略:彻底重构、再合并、原地更新及混合策略,具体解释参考原书 3.6 节。与爬虫策略相似,不一样属性的单词其索引更新策略也能够不一样
有些文档有必定的结构,例如邮件有发件人、收件人、标题和正文等,有些搜索指明了搜索结构文档中的某一部分,例如只在收件人列表中搜索。实现多字段索引须要使用必定途径得到文档的结构信息和单词与文档结构间的信息
多字段索引常见三种方法:
对于搜索引擎而言创建分布式索引的方案有两种:按文档划分、按单词划分
按文档划分就是全部机器的功能都是相同的,不一样机器对不一样文档创建索引,每次查询的时候会发广播给全部机器
按单词划分则不一样机器对不一样的单词创建索引,一次查询只会涉及到部分机器
经常使用的方法是按文档进行索引,由于按单词进行索引有如下缺点:
索引创建以后就可使用索引来查询了,使用索引进行查询有两大类方法:一次一文档、一次一单词
查询的目的在于得到与查询信息相关的文档,若是查询结果有多个,还需对结果文档按照相关度进行排序。对文档相关度的计算能够从两个角度进行,一种是计算完一个文档后再计算另外一个文档,另外一种是先计算每一个文档关于某个单词的相关度得分,最后把得分累加,即为文档的最终得分
一次一文档
以倒排列表中包含的文档为单位,每次计算一个文档和查询字段的最终类似性,而后计算余下文档,最后对文档得分进行排序
一次一单词
以查询单词为单位,每次查询一个文档关于一个单词的得分,查询完一个单词所涉及的全部文档后再查下一个单词。累加全部单词得分即为文档的最终得分
常见的短语查询方法
位置信息索引方式很直观,单词在文档中出现的顺序和短信中的顺序相同即认为匹配,但当短信中包含的单词比较多时效率不高
双词索引在常见的双词短信中的两个单词之间创建链接,能够经过双词的首词快速的找到下词。双词索引会消耗大量的存储空间,故通常只对常见短语使用这种方式
短语索引就是将短语看成单词看待并为其创建索引,短语索引通常须要结合数据挖掘来得到热门短语
短语亦有属性与类别,不一样属性的短信可使用不一样的索引方式
布尔模型是检索模型中最简单的一种,其数学基础是集合论。在布尔模型中,文档与用户查询由其包含的单词集合来表示,二者 的类似性则经过布尔代数运算来进行断定,例如:Query = apple AND ( Jobs OR Ipad2 )
,单词文档矩阵结果为 true 时返回对应的文档 ID
常见的方式是以单词做为特征,使用 t 维带权重向量表示一个文档。检索时将用户查询信息也当作一个特殊的文档亦转化为特征向量,使用向量距离度量查询与文档的相关性
几率检索模型是当前效果最好的模型之一,大部分商用搜索引擎都使用这种方式。BM25 是当前效果最好的几率搜索模型
看完贝叶斯以后再看一遍
判断由文档生成用户查询的可能性有多大,而后按照这种生成几率由高到低排序,做为搜索结果
当排序因子比较多时使用机器学习方法较好
用户点击能够看作是一种标签,点击率高说明当前页面和查询相关性高
搜索引擎在检索信息时经常使用的两大特征:
网页和查询的相关性
网页的重要性
入链、出链、锚文字
PageRank 算法主要使用网页的入链(个数与质量)做为依据来给网页打分,PageRank 算法与用户查询无关
其余改进算法:
HITS 算法有两个主要的概念: Hub 页面和 Authority 页面。Authority 页面指与某个领域或者话题相关度高的网页,例如与视频相关度高的网页有腾讯视频、优酷视频等;Hub 页面指的是包含不少出链指向高质量 Authority 页面的页面。HITS 算法在海量网页中找到与用户查询主题相关的高质量 Authority 页面和 Hub 页面并以此为结果返回给用户
HITS 算法与用户查询密切相关
SALSA 和 Hilltop 算法是 PageRank 和 HITS 算法的结合与改进
关键词重复、网页标题做弊、网页重要标签做弊、内容农场等
连接农场、google 轰炸(精心设计锚文字)、连接购买等
用户看见的内容和搜索引擎收录的内容不一样,例如 IP 地址做弊、页面内容隐藏等
web 2.0 指的是一个利用 Web 平台,由用户主导而生成内容的互联网产品模式,区别传统(web 1.0)由网站雇员主导生成内容的互联网模式
常见做弊手段有:博客做弊、点评做弊、微博做弊等
信任传播模型(信任知网,则检索知网全部内容)、不信任传播模型(剔除部分不可靠的网站)、异常发现模型、综合模型等
分析用户意图以向用户展现更准确的搜索内容
常见手段:
Lucene (['lu:si:n]
) 是基于 java 的开源全文索引工具包
本文内容参考 how2j,感谢~
// 1. 准备中文分词器 IKAnalyzer analyzer = new IKAnalyzer(); // 2. 使用测试数据建立索引 List<String> productNames = new ArrayList<>(); productNames.add("飞利浦led灯泡e27螺口暖白球泡灯家用照明超亮节能灯泡转色温灯泡"); productNames.add("飞利浦led灯泡e14螺口蜡烛灯泡3W尖泡拉尾节能灯泡暖黄光源Lamp"); productNames.add("雷士照明 LED灯泡 e27大螺口节能灯3W球泡灯 Lamp led节能灯泡"); productNames.add("飞利浦 led灯泡 e27螺口家用3w暖白球泡灯节能灯5W灯泡LED单灯7w"); productNames.add("飞利浦led小球泡e14螺口4.5w透明款led节能灯泡照明光源lamp单灯"); productNames.add("飞利浦蒲公英护眼台灯工做学习阅读节能灯具30508带光源"); productNames.add("欧普照明led灯泡蜡烛节能灯泡e14螺口球泡灯超亮照明单灯光源"); productNames.add("欧普照明led灯泡节能灯泡超亮光源e14e27螺旋螺口小球泡暖黄家用"); productNames.add("聚欧普照明led灯泡节能灯泡e27螺口球泡家用led照明单灯超亮光源"); Directory index = new RAMDirectory(); IndexWriterConfig config = new IndexWriterConfig(analyzer); IndexWriter writer = new IndexWriter(index, config); for (String name : productNames) { Document doc = new Document(); doc.add(new TextField("name", name, Field.Store.YES)); writer.addDocument(doc); } writer.close(); // 3. 查询器 String keyword = "护眼带光源"; Query query = new QueryParser("name", analyzer).parse(keyword); // 4. 搜索 IndexReader reader = DirectoryReader.open(index); IndexSearcher searcher = new IndexSearcher(reader); int numberPerPage = 1000; System.out.printf("当前一共有%d条数据%n",productNames.size()); System.out.printf("查询关键字是:\"%s\"%n",keyword); System.out.printf("查询字符串分词结果:\"%s\"%n",query); ScoreDoc[] hits = searcher.search(query, numberPerPage).scoreDocs; // 5. 显示查询结果 for (int i = 0; i < hits.length; ++i) { ScoreDoc scoreDoc= hits[i]; int docId = scoreDoc.doc; Document d = searcher.doc(docId); List<IndexableField> fields = d.getFields(); System.out.print((i + 1)); System.out.print("\t" + scoreDoc.score); for (IndexableField f : fields) { System.out.print("\t" + d.get(f.name())); } System.out.println(); } // 6. 关闭查询 reader.close();
执行结果 1:
查询关键字是:"护眼带光源" 查询字符串分词结果:"name:护眼 name:带 name:光源" 1 5.159822 飞利浦蒲公英护眼台灯工做学习阅读节能灯具30508带光源 2 0.43331528 欧普照明led灯泡蜡烛节能灯泡e14螺口球泡灯超亮照明单灯光源 3 0.425806 飞利浦led灯泡e14螺口蜡烛灯泡3W尖泡拉尾节能灯泡暖黄光源Lamp 4 0.425806 飞利浦led小球泡e14螺口4.5w透明款led节能灯泡照明光源lamp单灯 5 0.425806 欧普照明led灯泡节能灯泡超亮光源e14e27螺旋螺口小球泡暖黄家用 6 0.425806 聚欧普照明led灯泡节能灯泡e27螺口球泡家用led照明单灯超亮光源
执行结果 2:
查询关键字是:"led 黄色" 查询字符串分词结果:"name:led name:黄色" 1 0.22168216 飞利浦led小球泡e14螺口4.5w透明款led节能灯泡照明光源lamp单灯 2 0.22168216 聚欧普照明led灯泡节能灯泡e27螺口球泡家用led照明单灯超亮光源 3 0.21906272 雷士照明 LED灯泡 e27大螺口节能灯3W球泡灯 Lamp led节能灯泡 4 0.20684227 飞利浦 led灯泡 e27螺口家用3w暖白球泡灯节能灯5W灯泡LED单灯7w 5 0.1634743 飞利浦led灯泡e27螺口暖白球泡灯家用照明超亮节能灯泡转色温灯泡 6 0.1634743 欧普照明led灯泡蜡烛节能灯泡e14螺口球泡灯超亮照明单灯光源 7 0.16064131 飞利浦led灯泡e14螺口蜡烛灯泡3W尖泡拉尾节能灯泡暖黄光源Lamp 8 0.16064131 欧普照明led灯泡节能灯泡超亮光源e14e27螺旋螺口小球泡暖黄家用
执行结果 3:
查询关键字是:"led 黄" 查询字符串分词结果:"name:led name:黄" 1 2.0358434 欧普照明led灯泡节能灯泡超亮光源e14e27螺旋螺口小球泡暖黄家用 2 0.22168216 飞利浦led小球泡e14螺口4.5w透明款led节能灯泡照明光源lamp单灯 3 0.22168216 聚欧普照明led灯泡节能灯泡e27螺口球泡家用led照明单灯超亮光源 4 0.21906272 雷士照明 LED灯泡 e27大螺口节能灯3W球泡灯 Lamp led节能灯泡 5 0.20684227 飞利浦 led灯泡 e27螺口家用3w暖白球泡灯节能灯5W灯泡LED单灯7w 6 0.1634743 飞利浦led灯泡e27螺口暖白球泡灯家用照明超亮节能灯泡转色温灯泡 7 0.1634743 欧普照明led灯泡蜡烛节能灯泡e14螺口球泡灯超亮照明单灯光源 8 0.16064131 飞利浦led灯泡e14螺口蜡烛灯泡3W尖泡拉尾节能灯泡暖黄光源Lamp
仔细查看执行结果 2 和 3,这两次搜索意图其实很相近,但 Lucene 却返回了彻底不一样的结果。实际的搜索引擎会考虑用户的搜索意图,例如自动修改用户查询字符串以得到语义(意图)类似的查询字符串而后进行查询,最后向用户展现综合后的查询结果
Lucene 和其余基于 Lucene 的搜索工具默认不包含中文分词其,默认环境下这些工具会将中文语句、段落或者文章分解为一个个单字,没法实现中文词语检索。IKAnalyzer 是一个三方中文分词器
以 “研究生命科学” 为例,使用默认的 Lucene 分词器,分词结果为 6 个独立的汉字:
研 | 究 | 生 | 命 | 科 | 学
使用 IKAnalyzer 做为分词器,分词结果为 5 个汉语单词:
研究生 | 研究 | 生命科学 | 生命 | 科学
Solr (['səulə]
)是一个开源搜索平台,用于构建搜索应用程序。它创建在 Lucene 之上
Solr 提供了相似 RESTful-API 的方式以便于其余系统与 Solr 进行通讯,同时 Solr 提供了 web Admin 界面,便于用户操做与管理
Core
若是说 Solr 至关于一个数据库的话,那么 Core 就至关于一张表
Field,查询时须要指定字段名
Core 至关于表,接下来就要为这个表设置字段,用于存放数据。使用 Solr 进行查询时须要指明查找的字段与查询的词,例如:
SolrUtil.query("name:小米 电视 平板",0,10)
、SolrUtil.query("category:家电",0,10)
和 Solr 同样, ElasticSearch 基于 Lucene,提供了更为便利的访问和调用
ES 和 Solr 同样没有默认的中文分词器,须要三方工具,安装命令:
elasticsearch-plugin.bat install file:.\elasticsearch-analysis-ik-6.2.2.zip
Kibana 是一个开源的分析和可视化平台,设计用于和 Elasticsearch 一块儿工做。Kibana 是分析 ES 中数据的工具,Kibana 提供了 Dev tools 工具,便于用户使用 RESTful 风格方式向 ES 服务发送请求
默认访问端口:127.0.0.1:5601
索引至关于就是一个数据库服务器上的某个数据库,因此索引也能够当作是 Elastic Search 里的某个数据库
PUT /how2java?pretty GET /_cat/indices?v DELETE /how2java?pretty PUT /how2java/product/1?pretty { "name": "蜡烛" }