免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: windoze
打印 上一主题 下一主题

[C++] 好久没写代码,觉得手痒,就写了一个搜索引擎 [复制链接]

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
11 [报告]
发表于 2012-08-03 14:20 |只看该作者
zylthinking 发表于 2012-08-03 13:26
lz 说说思路呗, 或者原理; 没作过。。。。。。。


搜索引擎的原理其实很简单,写出来没两页纸。

首先需要用输入数据创建索引,对于互联网搜索引擎,输入数据是一个个由爬虫从网上抓回来的网页,经过清洗之后进行内容抽取,然后整理成统一的格式交给索引程序创建索引。
索引由以下几个基本的组成部分:
1. 倒排索引,这一部分存放"关键字"->文档的映射,一般来说会把同一个关键字对应的所有文档按照统一方法整理成一个排好序的线性结构,以便遍历和各种AND/OR之类的操作。
2. 正排索引,这一部分存放每个文档的各种属性
索引程序要干的事就是从源数据中拿出每个关键字和各种属性,整理成索引文件。文本变成关键字的过程叫做关键字提取,对于英语等语言,这个过程相对容易,一般就是进行大小鑫转换,拼写检查,字根提取等工作,例如源文本中的“goes”,“going”,“went”统一转换为“go”等;对于中文来说这个过程会比较麻烦,需要进行分词,常用的分词方法有单字切分、正/反向最大匹配、n元分词、隐马模型等。没有那一种单一的方法能满足所有需求,所以实际应用中一般会将多种方法结合使用。

索引创建好之后就可以搜索了,一个典型的搜索过程有这几个步骤:
1. 倒排索引的查询,一般称为“全文检索”,根据输入的关键字序列T1,T2..Tn,在倒排索引中找到对应的文档链,根据查询需求进行AND或者OR的组合,得到一个满足条件的结果集,对于典型的全文搜索引擎,这个阶段还需要计算每个文档的文本相关性以便排序,常用的文本相关性算法有TDIDF、BM25、VSM、LM等。
2. 正排索引过滤,在得到满足全文检索的文档集后,对每个文档检查其属性是否满足过滤条件,如果不满足则丢弃,剩下的就是最终的结果集。
3. 排序,全文搜索引擎一般的做法是:基于倒排索引查询得到的文本相关性,结合正排索引中的各种属性进行加权,例如给较新的文档加分等,最终得到一个分值,然后对结果集进行排序,保留前若干个结果返回给用户。

以上的过程就是全文搜索引擎的大致工作过程,其中复杂之处在于如何评估输入的查询条件和文档之间的匹配程度,文本相关性只能满足一部分需求,还需要其它一些因素来对文档得分进行调整,例如Google的PageRank就是通过进出的链接对文档重要性进行评估的一种方法。

垂直搜索引擎的基本工作原理和上述的一样,但是侧重点不同,一般来说垂直网站更重视文本之外的各种属性,例如电商网站会很关注商品的库存量和售价,如果排序结果将无库存或者过于昂贵的商品放在最前面会严重影响销售量;本地搜索网站会很关注POI和用户之间的距离,如果将一家距离用户很远的商户排在结果的前面同样也会造成很不好的体验。

另外还有一个很重要的问题就是索引的更新,对于互联网搜索引擎来说,一般会采用定期重建的策略,例如google就是每个几个小时将一个索引块整个重建,但是这种策略对于电商网站显然不行,例如在淘宝上可以进行拍卖,用户出价会导致拍卖价格迅速变化,需要在很短时间内迅速将这个价格的变化反映到搜索结果中,这就需要一些专门设计的索引结构来支持。

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
12 [报告]
发表于 2012-08-03 14:28 |只看该作者
呵呵,做伟大的事情要靠手痒才行。。。{:3_189:}

虽然看不懂,支持一下

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
13 [报告]
发表于 2012-08-03 14:30 |只看该作者
回复 11# windoze


    lzv5,871b

虽然看不懂,支持一下)

论坛徽章:
0
14 [报告]
发表于 2012-08-03 15:10 |只看该作者
回复 1# windoze


    我来支持红色小魔鬼的....

论坛徽章:
0
15 [报告]
发表于 2012-08-03 15:17 |只看该作者
牛X,佩服佩服

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
16 [报告]
发表于 2012-08-03 19:49 |只看该作者
顶!等有空了学习一下

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
17 [报告]
发表于 2012-08-03 22:40 |只看该作者
不懂,支持一席。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
18 [报告]
发表于 2012-08-04 11:07 |只看该作者
写得不错。

论坛徽章:
0
19 [报告]
发表于 2012-08-06 10:15 |只看该作者
不错不错, 支持!!

论坛徽章:
0
20 [报告]
发表于 2012-08-10 22:43 |只看该作者
学习精神可嘉 代码一般
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP