1. 为什么需要搜索平引擎
首先先思考下面的几个问题:
-
我们的应用中一般用什么来存储数据?
数据库如 MySQL -
我们经常浏览新闻、博客、商品等,存储这些数据的表都应该有哪些字段?
-
在数据库中如何做下面的查询? 以上面的新闻表为例
-
当数据量变大时,上边3中的四个查询都变慢了,该如何优化?
常用的数据库优化方法:
建索引、分区表 -
建索引对“查询与钓鱼岛有关的新闻”有效率上边的提升吗?为什么?
答案是没有的 -
索引的原理是怎样的?
对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表中就可以利用二分查找快速找到要查找的行的地址,再根据地址直接取行数据。 -
索引的排序,是怎么排的?
数值列 : 数值大小
时间列 : 转换成long之后按照数值大小
文本列 : 按照字符集编码 -
在“新闻标题”列上建索引后,当我们查询 标题 = “钓鱼岛”,数据库会怎么去查?
而当我们查询 标题 LIKE ‘%钓鱼岛%’,数据库此时无法使用索引进行查询,所以无法提升效率,此时会全表扫描。
由以上八个问题,我们可以得出以下的结论:
结论:
数据库适合结构化数据的精确查询,而不适合半结构化、非结构化数据的模糊查询及灵活搜索(特别是数据量大时),无法提供想要的实时性。
- 结构化数据:用表、字段表示的数据
- 半结构化数据:xml html
- 非结构化数据:文本、文档、图片、音频、视频等
2. 搜索引擎是如何做到快速查询的
1思考:如何做才能快速查询到与“钓鱼岛是中国的”有关的新闻?
分析:我们查询时,输入的是“钓鱼岛是中国的”,想要得到标题或内容中包含“钓鱼岛是中国的”的新闻列表。
如何做,可以快速找到包含“钓鱼岛”的文章id,包含“中国”的文章id?
- 倒排索引

2.为什么称为倒排索引?
英文原名Inverted index,失败地翻译成了倒排索引,正确翻译为:反向索引

- 下面这两个索引可以合并在一起吗?
正确的合并方式

上边的合并方式节约了存储空间,提升了检索效率。
-
反向索引的记录数会不会很大?
正常来说是不会的,可以查看下面的图:
所以一般来说最多也不会超过100W个
-
如何建立这样一个索引?
-
如果要开发一个中文分词器,你觉得该怎么实现对一句话进行分词?
语句示例:张三说的却是在理:
-
java开源的中文分词器有哪些?
-
有很多,如何选择?
1.准确率 2.分词效率 3.中英混合分词支持 -
常用的中文分词器有:IKAnalyzer mmseg4j
-
分词器在分词时能不能统计出词的出现次数、位置?有什么作用?
可以,这样可以方便进行一个短语查询和高亮等等。
-
你、我、他、的、地、了、标点符号…..这些需要为其创建索引吗?
这种词一般称为停用词,不会被索引 -
当出现了新词了,该怎么办?
撩妹老司机、软妹子、直男 遇到这种情况就需要允许自行添加内容到字典
所以由以上十个点,可以得出结论,如果要快速查询到指定的内容的新闻
结论:使用分词器对数据进行分词,建立反向索引。
3. 有了反向索引了,如何进行搜索?
- 步骤1: 对搜索输入进行分词
钓鱼岛、中国 -
步骤2: 在反向索引中找出包含钓鱼岛、中国的文章列表
- 步骤3: 合并两个列表,排序输出
{1,12,8,5}
由上边的内容,引申出以下问题:
- 问题1:合并后列表该如何排序?我们希望最相关的排在最前面
- 问题2:相关性如何度量?
人可以通过读内容判定相关性,机器不懂人话。
得建立一套能评估相关性的模型。 - 问题3:如何根据次数建立一个相关性评估模型?
-
规则1:统计出现次数,根据次数从高到低排序
-
规则2:加入权重,标题权重10,内容权重1,计算权重得分,按高-低排序
4. 其他的剩余议题
4.1 反向索引更新:数据更新时,索引是不是必须得更新?好更新吗?
正常来说是不存在更新这个操作的,实现更新操作的方式也很简单粗暴,就是先删除文章然后再重新索引该文章。
4.2 反向索引是存储在内存中,还是磁盘中合适?反向索引会有多大?
一般到都是写到磁盘上,然后用buff快速写入。
4.3 搜索引擎需要支持精确搜索吗?需要支持像数据库一样的多条件AND OR组合搜索吗?
必须要支持
5. Lucene
最受欢迎的java开源全文搜索引擎开发工具包。提供了完整的查询引擎和索引引擎,部分文本分词引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索功能,或者是以此为基础建立起完整的全文检索引擎。
是Apache的子项目,网址: http://lucene.apache.org/
- Lucene在ES中的应用
ES将index的数据分为多份,每份叫一个shard,为了提高数据可用性,每个shard都会有冗余副本,每个副本实际上是一个Lucene index实例.
如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~
网友评论