问题

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

简单搜索

一种简单粗暴的做法是:

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. Java BigDecimal进行精确计算

    前言 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以 ...

  2. Oracle实例

    ORA-12505 Listener refused the connection with following error:ORA-12505,TNS:listener 确定这是连接数据库的SID错 ...

  3. linux 常用awk命令

    linux awk命令详解awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每 ...

  4. ubuntu 安装ssh 服务

    百度地址: http://jingyan.baidu.com/article/00a07f38a5c05482d128dc5f.html

  5. python学习笔记——fork()创建多进程

    1 进程概述 引自 Python 多进程 fork()详解 1.1 进程 进程是程序的一次动态执行过程,它对应了从代码加载.执行到执行完毕的一个完整过程. 进程是系统进行资源分配和调度的一个独立单位. ...

  6. python学习笔记——高阶函数map()

    满足以下两点中任意一点,即为高阶函数: 1.函数接收一个或多个函数作为参数 2.函数返回一个函数 1 描述 用函数和可迭代对象中每一个元素作为参数,计算出新的迭代对象 map() 会根据提供的函数对指 ...

  7. java多线程学习--java.util.concurrent

    CountDownLatch,api 文档:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.h ...

  8. inux --- 服务器性能监控

    几个问题 先来看看下面几个问题: CPU.内存以及硬盘的关系是怎样的? 进程和线程是什么?有什么区别?有什么优缺点? 什么是物理内存?什么是虚拟内存?什么时候要用到虚拟内存? 什么是CPU中断?CPU ...

  9. android自动弹出软键盘(输入键盘)

        很多应用中对于一个界面比如进入搜索界面或者修改信息等等情况,为了用户体验应该自动弹出软键盘而不是让用户主动点击输入框才弹出(因为用户进入该界面必然是为了更改信息).具体实现这种效果如下: [代 ...

  10. C#实现WinForm下DataGridView控件的拷贝和粘贴

    DataGridView控件应该是数据库应用系统最常用的控件之一,其方便性不言而喻的.往往用户在使用过程中会提出"从DataGridView空间 中拷贝数据或是向某个DataGridView ...