scrapy+Lucene搭建大型搜索引擎(现代信息检索大作业)

优采云 发布时间: 2020-08-17 19:06

  scrapy+Lucene搭建大型搜索引擎(现代信息检索大作业)

  推荐:信息检索:对搜索引擎性能的评价指标的小作业---pooling方式以及MAP value的估算

  最近《信息检索》课程的homework,要评价信息检索评价指标,涉及到一些小东西,比如说pooling method(缓冲池)的估算、MAP values的估算、画P-R图,于是记录出来

  2020腾讯云8月秒杀活动,优惠特别大!(领取2860元代金券),

  地址:

  2020阿里云最低价产品入口,含代金券(新老用户有让利),

  地址:

  一、选题

  工程类搜索型:

  定向采集 3-4 个新闻网站, 实现这种网站信息的抽取、索引和检索。网页数 目不多于 10 万条。能按相关度、时间、热度 (需要自己定义) 等属性进行排序, 能实现相像 新闻的自动聚类。

  要求: 有相关搜索推荐、snippet 生成、结果预览 (鼠标移到相关结果, 能预览) 功能

  二、项目线上访问地址 三、开发工具 四、设计方案 4.1整体思路

  在实现新闻信息检索系统时首先进行了信息采集,信息采集结束以后使用 Lucene 提供的 api 构建索引库, 前端使用 jsp 接收用户查询,在后台使用 servlet 对用户查询进 行动词处理,之后到索引库中进行文档匹配, 最后把查询结果集反馈给用户并在后端页面中 展示。

  4.2信息采集

  Scrapy 是 Python 开发的一个快速、高层次的屏幕抓取和 web 抓取框架,用于抓取 web 站点并从页面中提取结构化的数据。我们采集了 10w+ 新闻数据, 新闻信息以 json 文件格 式保存。scrapy 采集流程:

  

  采集到的新闻数据:

  

  新闻格式:

  

  4.3倒排索引建立

  在索引建立模块,主要包括下边三个关键步骤: 数据预处理、新闻内容动词、构建倒排 索引。

  **数据预处理:**Gson 是 Google 提供的拿来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象, 或者反过来。我们使用 Gson 把 json 文件转换为 News 对象

  **中文动词:**IK Analyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具 包,IK 发展为面向 Java 的公用动词组件,独立于 Lucene 项目,同时提供了对 Lucene 的默 认优化实现。IK 分词采用了特有的“正向迭代最细细度切分算法“, 支持细粒度和智能动词两 种切分模式, 并且采用了多子处理器剖析模式, 支持英语字母、数字、中文词汇等分词处理, 兼容日文、日文字符。

  **构建倒排索引:**Lucene 提供了建立倒排索引的方式,步骤如下图所示:

  

  Luke 是一个用于 Lucene 搜索引擎的,方便开发和确诊的第三方工具,它可以访问

  现有 Lucene 的索引. 使用 luke 打开索引目录,可以见到新闻信息被储存到索引库中。

  

  推荐:抓取豆瓣影视信息

  public class DoubanBaiKe { private Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 豆瓣影片搜索的URL地址 */ priv

  4.4索引查询

  索引创建好之后,查询可分为以下几个步骤:

  1. 设置查询索引的目录 (这里就是里面创建索引的目录).

  2. 创建 indexSearcher.

  3. 设置 query 的动词形式

  4. 设置查询域, 比如查询域为 news title, 那么就到新闻标题域去比对 5. 设置查询字符串,也就是要查询的关键词.

  6. 返回结果是一个文档集合,放在 TopDocs 中,通过循环 TopDocs 数组输出查询结果. 用户通常只看前几页的数据,为了推动后端的数据展示, 返回前 1000 条数据到前台。

  4.5关键字高亮

  检索结果高亮对于用户的体验度和友好度十分重要,可以快速标记出用户检索对关键 词。Lucene 的 Highlighter 类可以用于返回文档中的关键字高亮,通过在关键字后面添加 css 片段来实现。

  4.6用户界面

  使用 jsp 编写用户界面,服务器为 Tomcat 7.0, 用户输入关键词之后递交表单,后

  台使用 servlet 接收用户查询, 之后把查询字符串作为搜索的 key 到索引库中搜索文档。检索疗效:

  

  4.7按时间排序和结果分页

  按时间排序: 所有的新闻结果储存在一个 list 集合中,集合中的每位元素为一个 News 对象, 通过重画 Comparator 类中的 compare 方法实现按集合中每位新闻元素的 Time 排 序。

  结果分页: 定义了一个 Page 类拿来记录当前页、总页数、每页多少条数据、总的数据 数、每页起始数、每页中止数、是否有下一页、是否有前一页。

  五、参考资料

  下面列举可参考的资料:

  1. lucene全文检索基础

  2. lucene创建索引

  3. Lucene查询索引

  4. Lucene查询结果高亮

  5. Lucene 查询(Query)子类

  6. java操作json

  7. java集合

  8. servlet基础

  六、总结

  开源工具的使用明显增强了开 发效率,但build from ground还须要学习好多东西,继续沉淀。

  欢迎批评见谅。

  推荐:实时检索系统Zoie实现剖析

  实时检索的核心原理 通常的检索系统中,建索引和查询是分开的,即建索引是离线的,新的索引会以一定频度(比如每隔5分钟)供查询端使用。对于一些站内检索来说,

  一、选题 工程类搜索型: 定向采集 3-4 个新闻网站, 实现这种网站信息的抽取、索引和检索。网页数 目不多于 10 万条。能按相关度、时间、热度 (需要自己定义) 等属性进行排序, 能实现相像 新闻的

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线