问题

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

简单搜索

一种简单粗暴的做法是:

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. HDUOJ----(4788)Hard Disk Drive

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  2. vi/vim 计算搜寻关键字数量

    http://hi.baidu.com/xletian/blog/item/f19962061a9a506c020881dc.html 在看过 vim 的全域指令和 search 指令之後,你会不会也 ...

  3. java提高篇之详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  4. oc 调用c语言方法和oc的方法调用

    //c语方的方法 void sayHello(){ printf("Hello OC"); } int main(int argc, char * argv[]) { sayHel ...

  5. DBA_实践指南系列10_Oracle Erp R12诊断功能Diagnostic(案例)

    2013-12-10 Created By BaoXinjian Thanks and Regards

  6. SSH2框架实现注冊发短信验证码实例

    这两天開始写程序了,让用SSH2框架,曾经没有接触过Java项目更没有接触过SSH2框架,所以用注冊開始了我Java之旅.后来发现,后台代码挺easy理解的,跟.net的差点儿相同.就是层与层之间的调 ...

  7. 基于配置的Spring MVC3

    网上查找的spring mvc3大部分都是基于注射的方式,总感觉注射有点怪怪.不利于后期扩展和项目管理,于是特意写下这篇基于xml配置的Spring MVC3.以供大家參考. 怎么建立web项目和下载 ...

  8. Objective-C学习笔记(四)——OC实现最简单的数学运算

    本篇帖子会实现使用OC的最简单的加减乘除运算.学习的知识点包含变量定义.运算方法,格式化输出等概念.主要学习主要的语法,事实上和C语言的语法还是比較相似的. 具体代码仅仅要写在main方法中即可了.具 ...

  9. tp查询范围

    一.查询范围 //说明username和password是对应模型下的  scopeUsername($query) 和scopePassword($query)方法 //关键字scope 在控制器如 ...

  10. Model实例化类属性与值使用反射拼接成SQL语句

    public string GetInsertSqlByModel(Object o) { StringBuilder sbStart = new StringBuilder(); StringBui ...