为了生存,就得干一行爱一行。那就学习下lucene吧。

全文检索介绍

流程:

  1. 建索引

    • 准备待搜索文档
    • 文档分词:将文档分成一个个单独的单词,去除标点符号、停词(无意义的冠词介词等),得到token
    • 语言处理:统一小写,单词缩减或转变为词根形式,得到term
    • 索引:用term创建字典,term->doc,对字典按字母顺序排序,合并相同的term成为文档倒排链表。term->doc1,doc2,doc3
  2. 搜索
    • 输入查询语句
    • 处理查询语句:词法分析、语法分析、语言处理,得到语法树
    • 搜索索引,得到符合语法树的文档
    • 根据文档和查询语句的相关性,进行结果排序

计算文档间的相关性:

文档有许多term组成,不同的term对文档的重要性不同。判断文档间的关系需要两步:

  • 计算各term对文档的权重

  • 计算文档和query间的相关性

文档由一系列的词组成,可以用各词的权重组成的向量代表一个文档。Doc vector = {weight1, weight2, ..., weightN},query也看做是一个文档,query和doc的词数取并集,不含某词,则对应的权重为0。

文档间的相关性转变为两个向量间的夹角大小,夹角越小,相关性越大。夹角越小,余弦越大,所以文档间的相关性如下计算:

Lucene

Lucene就是一个开源的全文检索库,java实现的,只支持纯文本文件的索引和搜索,不负责其由其他格式文件抽取文本或从网络抓取文件。它的工作流程和上述相似。

代码实例

  1. //建索引
  2. Analyzer analyzer = new MaxWordAnalyzer();//词法分析器
  3. IndexWriter writer = new IndexWriter(new RAMDirectory(), analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); //建索引主类
  4. Document doc = new Document();//待索引文档
  5. doc.add(new Field("id","1",Field.Store.YES,Field.Index.NOT_ANALYZED));//文档属性
  6. doc.add(new Field("name","zhangsan",Field.Store.YES,Field.Index.ANALYZED_NO_NORMS);
  7. writer.addDocument(doc);
  8. writer.commit();
  9. //搜索索引
  10. QueryParser parser = new QueryParser(Version.LUCENE_30, "name", analyzer);//语法分析器(词法、语法分析)
  11. Query q = parser.parse("zhangsan");//查询语句的语法分析获得语法树
  12. IndexSearcher searcher = new IndexSearcher(writer.getReader());//查询主类
  13. TopDocs docs = searcher.search(q,10);//搜索
  14. for (ScoreDoc scoreDoc : docs.scoreDocs) {
  15. //展示结果
  16. Document doc = searcher.doc(scoreDoc.doc);
  17. System.out.println(doc.get("id") + doc.get("name"));
  18. }

Lucene包结构

红线为建索引过程,蓝线为搜索过程。

analysis:语言分析器,对需要建立索引的文本进行分词、过滤等操作,如Analyzer类

index:索引管理,负责索引的创建、删除,如IndexWriter。索引包是整个系统核心,全文检索的根本就是为每个切出来的词建索引,查询时就只需要遍历索引,而不需要去正文中遍历,从而极大的提高检索效率。

store:数据存储管理,主要包括一些底层的I/O操作,如Directory

queryParser:查询分析器,生成语法树,实现查询关键词间的运算,如QueryParser

search:对索引的搜索,根据查询条件,得到结果,如IndexSearcher

similarity:对相关性打分模型的实现

Lucene系列-概述的更多相关文章

  1. Python网络数据采集系列-------概述

    这是一个正在准备中的系列文章,主要参考的是<Web Scraping with Python_Collecting Data from the Modern Web-O'Reilly(2015) ...

  2. Lucene系列-FieldCache

    域缓存,加载所有文档中某个特定域的值到内存,便于随机存取该域值. 用途及使用场景 当用户需要访问各文档中某个域的值时,IndexSearcher.doc(docId)获得Document的所有域值,但 ...

  3. [lucene系列笔记1]lucene6的安装与配置(Windows系统)

    lucene是一个java开源的高效全文检索工具包,最近做项目要用到,把学习的过程记录一下. 第一步:下载安装jdk 1.首先从官网下载jdk(下载之前先查看你的电脑是多少位操作系统,如果是32就下载 ...

  4. Lucene系列-索引文件

    本文介绍下lucene生成的索引有哪些文件组成,每个文件包含了什么信息.基于Lucene 4.10.0. 数据结构 索引(index)包含了存储的文档(document)正排.倒排信息,用于文本搜索. ...

  5. Lucene系列-近实时搜索(1)

    近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大.更新较频繁的情况下使用.本文主要来介绍下如何 ...

  6. Lucene系列-facet

    1.facet的直观认识 facet:面.切面.方面.个人理解就是维度,在满足query的前提下,观察结果在各维度上的分布(一个维度下各子类的数目). 如jd上搜“手机”,得到4009个商品.其中品牌 ...

  7. Lucene系列-搜索

    Lucene搜索的时候就要构造查询语句,本篇就介绍下各种Query.IndexSearcher是搜索主类,提供的常用查询接口有: TopDocs search(Query query, int n); ...

  8. Lucene系列-分析器

    分析器介绍 搜索的基础是对文本信息进行分析,Lucene的分析工具在org.apache.lucene.analysis包中.分析器负责对文本进行分词.语言处理得到词条,建索引和搜索的时候都需要用到分 ...

  9. 笔记之Cyclone IV 第一卷第一章FPGA 器件系列概述

    因为本人用的黑金四代开发板,中央芯片采用ALTERA的cycloneIV E,所以就此器件阅读altera官网资料,并做相应的笔记,以便于以后查阅 Cyclone IV 器件系列具有以下特性:■ 低成 ...

随机推荐

  1. js跨域访问

    什么是跨域 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: 首 ...

  2. firefox的console log功能

    http://www.ruanyifeng.com/blog/2011/03/firebug_console_tutorial.html Firebug是网页开发的利器,能够极大地提升工作效率. 但是 ...

  3. java线程池初步理解

    多线程基础准备 进程:程序的执行过程,持有资源和线程 线程:是系统中最小的执行单元,同一个进程可以有多个线程,线程共享进程资源 线程交互(同步synchronized):包括互斥和协作,互斥通过对象锁 ...

  4. The implementation details of the built thermal setup

    Lucid infrared thermography of thermally-constrained processors

  5. col-md-*,col-xs-*

    class属性 col-md-*,md 表示 medium (中等的),* 代表一个数字,它指定了这个元素所占的列宽. 在中等大小的屏幕上(例如笔记本电脑),元素的列宽被指定了. col-xs-* , ...

  6. FMDB读取Datetime类型值为1970的问题

    1.问题 今天使用FMDB做一个例子程序,新建的一张表有一个datetime字段,数据库有默认值,大概如下 CREATE TABLE [ConsumptionType] ([id] INTEGER P ...

  7. [Leetcode][JAVA] Convert Sorted Array to Binary Search Tree && Convert Sorted List to Binary Search Tree

    Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...

  8. Python学习之路—Day1

    第1章 Python语言简介 1.1 Python是什么 Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn)是什么呢?简单的说,它是一种计算机编程语言及一组配套的软件工具和库. ...

  9. C++是一把很奇怪的刀

    C++是一把很奇怪的刀,首尾都是刀刃.用刀能出什么,还是要看拿刀的人.

  10. 解决Ubuntu发热量大的问题

    转自:http://blog.csdn.net/tracker_w/article/details/8801971 用Ubuntu 的朋友应该都有体会,开机不久风扇就开始狂转,本本也会很热.据说是双显 ...