问题

现在给出很多份文档,现在对某个搜索词感兴趣,想找到相关的文档。

简单搜索

一种简单粗暴的做法是:

1、读取每个文档;
2、找到其中含有搜索词的文档;
3、对找到的文档中搜索词出现的次数统计;
4、根据搜索词统计次数对文档按降序排序。

这称之为信息获取(Information Retrieval, IR),也叫简单搜索

普通IR方案存在的问题:
    文档的体积增大或者数量增多,算法效率会下降
   
改进搜索的方案

Lucene项目对文档进行索引来快速搜索。

问题又来了:
仅有索引仍不够,还有:

链接分析(PageRank)

用户点击分析

自然语言处理

无链接文档的排序,

这些技术能增强搜索功能。

搜索的过程

通过爬虫从互联网中搜集数文档
用Lucene来分析、索引并搜索搜集的文档。

搜索的基本过程:加载、索引、搜索。

FetchAndProcessCrawler类

快速读取和存储网页的类FetchAndProcessCrawler(还可从互联网读取数据),
采集数据并解析,处理结果放在一个目录中。
每一组处理过的文档,都有四个相应的子目录:fetched、knownurls、pagelinks和processed。
分开了网页的元数据和核心内容,取出网页的链接(外链,outlink)。

LuceneIndexer类

LuceneIndexer类(对LuceneIndexBuilder的包装)
对以处理过的数据进行索引
Lucene用IndexWriter类创建索引,其构造函数的三个参数为:
1、存放索引的目录
2、所使用的分析器
3、布尔变量,决定是否覆盖已有的目录

爬去的文档是按组分类的:
第一组是初始URL的文档
第二组是第一组文档链接指向的文档
第三组是第二组中文档中链接所指向的文档

indexDocument方法索引每组中各个文档的内容,Lucene的类Document类封装了所采集的文档,
从而能将它们添加到索引中,这个类不仅能用来封装网页,还能将所以可以解析并能转换成纯文本的文档。

每一个Document类的实例都是一个由若干个域组成的虚拟文档。
用分解的方法处理所采集的文档,从而为每个文档创建若干个Field实例。
content域:文本文档的内容,删除了格式化标签和其他注释
url域:用于获取文件的URL
docid域:文档独一无二的标识符
title域:文件的标题
doctype域:文件的类型

每个文档的content域都会被索引,但是不会存放在索引文件中;
其他域都会存放在索引文件中,但不会被索引。
尽管是对文档内容进行查询,但是也需要从索引文件中获得文档的URL、ID和标题。

这中常用的做法在索引文件中只需存放一些能识别搜索结果的指针,如果没有特别的原因
(例如随时获得部分内容,而原始来源不能直接访问),不需要直接把内容放在索引文件中。

MySearcher类

MySearcher类搜索新建的索引
构造方法为索引所在目录。
使用search方法进行搜索,有两个参数:
需要在索引中查询的字符串;
想要获取的文档数量的上限。

search方法的步骤:

1、使用Lucene的IndexSearcher类的实例打开要搜索的索引;

2、创建一个Lucene的QueryParser类的实例,参数是要搜索的域和分析查询文本所必需的分词器;

3、用QueryParser的parse方法将人类语言查询转换成一个Lucene能理解的Query实例;

4、搜索索引,结果以Lucene的Hits对象的形式返回;

5、遍历前n个结果,放在SearchResult对象中。Lucene的Hits对象中只含有指向文档的引用。用这些引用收集所需的域;

6、记录每个文档的相关性分数,在0~1之间。

用Lucene对文档进行索引搜索的更多相关文章

  1. ElasticSearch入门系列(三)文档,索引,搜索和聚合

    一.文档 在实际使用中的对象往往拥有复杂的数据结构 Elasticsearch是面向文档的,这意味着他可以存储整个对象或文档,然而他不仅仅是存储,还会索引每个文档的内容使之可以被搜索,在Elastic ...

  2. 有关Lucene的问题(4):影响Lucene对文档打分的四种方式

    原文出自:http://forfuture1978.iteye.com/blog/591804点击打开链接 在索引阶段设置Document Boost和Field Boost,存储在(.nrm)文件中 ...

  3. elasticsearch——海量文档高性能索引系统

    elasticsearch elasticsearch是一个高性能高扩展性的索引系统,底层基于apache lucene. 可结合kibana工具进行可视化. 概念: index 索引: 类似SQL中 ...

  4. ES 文档与索引介绍

    在之前的文章中,介绍了 ES 整体的架构和内容,这篇主要针对 ES 最小的存储单位 - 文档以及由文档组成的索引进行详细介绍. 会涉及到如下的内容: 文档的 CURD 操作. Dynamic Mapp ...

  5. Elasticsearch 7.x 之文档、索引和 REST API 【基础入门篇】

    前几天写过一篇<Elasticsearch 7.x 最详细安装及配置>,今天继续最新版基础入门内容.这一篇简单总结了 Elasticsearch 7.x 之文档.索引和 REST API. ...

  6. jdk1.8帮助文档中文可搜索

    jdk1.8帮助文档中文可搜索 链接:https://pan.baidu.com/s/11beeZLpEIhciOd14WkCpdg 提取码:t4lw

  7. 使用requests爬取梨视频、bilibili视频、汽车之家,bs4遍历文档树、搜索文档树,css选择器

    今日内容概要 使用requests爬取梨视频 requests+bs4爬取汽车之家 bs4遍历文档树 bs4搜索文档树 css选择器 内容详细 1.使用requests爬取梨视频 # 模拟发送http ...

  8. Lucene 对文档打分的规则整理记录

    摘引自:http://www.cnblogs.com/forfuture1978/archive/2010/02/08/1666137.html Lucene的搜索结果默认按相关度排序,这个相关度排序 ...

  9. glib 文档 代码 索引 编译

    ./configure --prefix=/opt/glib-2.28.8 --enable-staticmakemake install linux下载 WIN32下载 代码索引 文档索引 GLib ...

随机推荐

  1. MongoDB: 聚集管道

    在MongoDB2.2新出现的. 聚集管道式基于数据处理管道概念建模的数据聚集框架.文档进入一个多阶段能将该文档转化为聚集结果的管道. 聚集管道提供了map-reduce方法了替代物,并在非常多聚集任 ...

  2. 【laravel5.4】自定义404、503等页面

    1.处理自定义错误或不存在页面:生产环境一定要关闭debug模式. public function render($request, Exception $exception) { if ($exce ...

  3. Tomcat路径下目录的介绍

           本文转自:http://blog.csdn.net/u013132035/article/details/54949593 下图是TOMCAT的路径下目录的截图. 目录有:backup. ...

  4. Java数据库表自动转化为PO对象

    本程序简单实现了数据库内省,生成PO对象. 数据库内省有如下两种实现方式: 通过mysql元表 通过desc table,show tables等命令 import java.io.IOExcepti ...

  5. eclipse的tasks使用说明

    http://blog.csdn.net/limb99/article/details/8881891tasks可以在代码里增加标识,通过tasks view可以快速的找到这些标识的地方,有助于提高开 ...

  6. Jmeter----逻辑控制器(Logic Controller)

    前言: 1. Jmeter官网对逻辑控制器的解释是:“Logic Controllers determine the order in which Samplers are processed.”.意 ...

  7. OpenSSH的RSA/DSA密钥认证系统

    OpenSSH的RSA/DSA密钥认证系统,它可以代替OpenSSH缺省使用的标准安全密码认证系统. OpenSSH的RSA和DSA认证协议的基础是一对专门生成的密钥,分别叫做私用密钥和公用密钥. 使 ...

  8. Unix环境高级编程(五)进程环境

    本章主要介绍了Unix进程环境,包含main函数是如何被调用的,命令行参数如何传递,存储方式布局,分配存储空间,环境变量,进程终止方法,全局跳转longjmp和setjmp函数及进程的资源限制. ma ...

  9. Linux内核(7) - 设备模型(上)

    对于驱动开发来说,设备模型的理解是根本,毫不夸张得说,理解了设备模型,再去看那些五花八门的驱动程序,你会发现自己站在了另一个高度,从而有了一种俯视的感觉,就像凤姐俯视知音和故事会,韩峰同志俯视女下属. ...

  10. Python rsplit() 方法

    描述 Python rsplit() 方法通过指定分隔符对字符串进行分割并返回一个列表,默认分隔符为所有空字符,包括空格.换行(\n).制表符(\t)等.类似于 split() 方法,只不过是从字符串 ...