欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Lucene学习笔记(一)-------Lucene基础

程序员文章站 2022-07-09 12:57:47
...

Lucene简介

  • 获取内容

    Lucene作为一个核心搜索库,并不提供任何功能来实现内容获取

  • 建立文档

    文档主要包括几个带值的域,比如标题(title),正文(body),摘要(abstract),作者(author)和链接(URL)

可以向比较重要的单个的文档或域中插入权值,加权操作可能在索引操作前就静态完成了,也可能要在搜索期间才动态完成。包括Lucene在内的几乎所有搜索引擎都会自动地静态地对内容较短的域进行加权。

Lucene提供了一个API建立域和文档,但不提供任何建立它们的程序逻辑,因为这些逻辑完全由调用API的应用程序根据具体情况完成。Lucene也不提供任何文档过滤器

  • 文档分析

    将文档中的文本域分割成词汇单元(即单词),常见的有词干提取器用于从单词中提取词根。Lucene提供了大量内嵌的分析器可以自定义分析链

  • 文档索引

    索引步骤中,文档被加入到索引列表,索引的优劣直接影响到搜索体验

  • 搜索组件

    从索引中查找单词,从而找到包含该单词的文档。搜索质量主要由准确率(Precision,衡量搜索系统查找相关文档的能力)和召回率(Recall,衡量搜索系统过滤非相关文档的能力)来衡量。Lucene的benchmark/contrib模块可以衡量搜索程序的准确率和召回率

搜索组件主要包括:

用户搜索界面: 搜索界面保持简洁,Lucene不提供默认搜索界面
建立查询: 将用户的输入转换成合适的查询(query)对象格式, Lucene提供一个查询解析器(QueryParser)的强大开发包,可以根据通用查询语法将用户输入的文本处理成查询对象,查询语句包含布尔运算、短语查询、通配符查询。也可以修改查询语句,对重要信息进行加权或过滤。
搜索查询:查询检索索引并返回与查询语句匹配的文档,结果返回时按照查询请求来排序。
常用的相关度计算模型包括:

纯布尔模型(Pure Boolean Model): 不管文档是否匹配查询请求,都不会被评分。在该模型下,匹配文档与评分不相关,也是无序的;一条查询仅获取所有匹配文档集合的一个子集
向量空间模型(Vector Space Model):查询语句和文档都是高维空间的向量模型,这里每一个独立的项都是一个维度。查询语句和文档之间的相关性或相似性由各自向量之间的距离计算得到
概率模型(Probabilistic Model):在该模型中,采用全概率方法来计算文档和查询语句的匹配概率

Lucene在实现上采用向量空间模型和纯布尔模型,并能针对具体搜索让你决定采用哪种类型

展现结果

管理界面:跟踪程序运行状况、配置程序各种组件、启动停止搜索服务
分析模块:采用不同的视角观察用户搜索,从而对搜索程序各模块的运行给予提示
搜索范围:使搜索程序能处理越来越大的搜索内容和更多的并发搜索请求,Lucene本身并没有提供搜索范围的处理模块,参见Solr、Nutch和Elasticsearch

索引过程的核心类
  • IndexWriter:写索引,是索引过程的核心组件,这个类负责创建新索引或者打开已有索引,以及向索引中添加、删除或更新被索引文档的信息。可以提供针对索引文件的写入操作,但不能读取或搜索。IndexWriter不能直接索引文本,需要Analyzer将文本分割成独立的单词。
  • Directory: 描述了Lucene索引的存放位置,它是一个抽象类,它的子类负责具体指定索引的存储路径,利用FSDirectory.open方法获取真实文件在文件系统的存储路径,然后将它们依次传递给IndexWriter类的构造方法。
  • Analyzer: Analyzer是IndexWriter的构造方法指定的,它负责从被索引文本文件中提取词汇单元,并剔除剩下的无用信息。非纯文本文件需要转为文本文档。Analyzer是一个抽象类,Lucene提供了几个类实现它。有的用于跳过停用词(stop words,指一些常用但不能帮助区分文档的词,如a、an、the、in和on等);有的用于把词汇单元转换成小写形式,以使搜索过程可以忽略大小写差别。分析器的分析对象是文档,该文档包含一些分离的能被索引的域
  • Document:文档对象代表一些域(field)的集合。文档的域代表文档和文档相关的一些元数据。
  • Field:索引中的每个文档都包含一个或多个不同名称的域即Field类,每个域都有一个域名和对应的域值,以及一组选项来精确控制Lucene索引操作各个阈值。文档可能拥有不止一个同名的域,在这种情况下,域的值就按照索引操作顺序添加进去。在搜索时,所有域的文本就好像连接在一起,作为一个文本域来处理。
搜索过程的核心类
  • IndexSearcher:用于搜索由IndexWriter类创建的索引(以只读方式打开索引):它公开了几个搜索方法,是连接索引的中心环节。需要利用Directory实例来掌控前期创建的索引,然后才能提供大量的搜索方法,其中一些方法在它的抽象父类Searcher中实现。最简单的搜索方式是将单个Query对象和int topN计数作为该方法的参数,并返回一个TopDocs对象。
Directory dir = FSDirectory.open("/tmp/index");
IndexSearcher searcher = new IndexSearcher(dir);
Query q = new TermQuery(new Term("content", "lucene"));
TopDocs hits = searcher.search(q, 10);
searcher.close();
  • Term:搜索功能的基本单元,包含一对字符串元素:域名和单词(或域文本值)。Term对象还与索引操作有关。搜索过程中可以创建Term对象,并和TermQuery对象一起使用
    要寻找contents域中包含单词lucene的前10个文档,并按照降序排列这10个文档。
Query q = new TermQuery(new Term("content", "lucene"));
TopDocs  hits = searcher.search(q, 10);

TermQuery对象是从抽象父类Query派生而来,可以在声明左侧使用Query类型。

  • Query:Lucene包含许多具体的Query(查询 )子类,包括TermQuery、BooleanQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、TermRangeQuery、NumericRangeQuery、FilteredQuery和SpanQuery。Query是它们共同的抽象父类。其中setBoost(float)方法给某个子查询赋予相对其他子查询对评分更高的权重。

  • TermQuery:Lucene提供最基本的查询类型,用来匹配指定区域中包含特定项的文档。

  • TopDocs:负责展示搜索结果,是一个简单的指针容器,指针一般指向前N个排名的搜索结果,搜索结果即匹配查询条件的文档。TopDocs会记录前N个结果中每个结果的int docID(用以恢复文档)和浮点型分数。