zoukankan      html  css  js  c++  java
  • scrapy+Lucene搭建小型搜索引擎

    Reference: http://blog.csdn.net/napoay/article/details/51477586

    一、选题

    工程类搜索型:

    定向采集 3-4 个新闻网站, 实现这些网站信息的抽取、索引和检索。网页数 目不少于 10 万条。能按相关度、时间、热度 (需要自己定义) 等属性进行排序, 能实现相似 新闻的自动聚类。 
    要求: 有相关搜索推荐、snippet 生成、结果预览 (鼠标移到相关结果, 能预览) 功能

    二、项目线上访问地址

    三、开发工具

    • jdk 版本:1.7
    • 服务器:Tomcat7.0
    • python:2.7
    • scrapy:1.0

    四、设计方案

    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 打开索引目录,可以看到新闻信息被存储到索引库中。 
    这里写图片描述

    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还需要学习很多东西,继续沉淀。 
    欢迎批评指正。

  • 相关阅读:
    背水一战 Windows 10 (97)
    背水一战 Windows 10 (96)
    背水一战 Windows 10 (95)
    背水一战 Windows 10 (94)
    背水一战 Windows 10 (93)
    Vue项目用于Ios和Android端开发
    Android assets文件夹之位置放置和作用
    轻松搭建Xposed Hook
    cordov vue项目中调用手机原生api
    Android 直接修改dex破解
  • 原文地址:https://www.cnblogs.com/skying555/p/6270527.html
Copyright © 2011-2022 走看看