推荐系统入门笔记2--信息检索 Lucene

1、概述:
是一款高性能的、可扩展的信息检索IR工具库,信息检索是文档搜索、文档信息搜索或者文档相关的元数据搜索等操作。
 
2、索引
①获取内容
②建立文档
获取了原始的内容以后,需要对内容进行索引,首先将内容转换为部件(文档),以供搜索引擎查找。比如标题、正文、摘要、作者、链接等。
③文档分析
搜索引擎并不能直接对文本进行索引,必须将文本分割成一系列被称为语惠单元的独立原子元素,每一个语汇单元大致与语言中的单词对应起来。
④文档索引
在索引步骤中把文档添加到索引列表。
 
3、搜索组件
搜索处理过程:从索引中查找单词,从而找到包含单词的文档。
搜索质量由查准率与查全率衡量。查全率:衡量搜索系统查找相关文档的能力;查准率:用来衡量搜索系统中过滤非相关文档的能力。
*Lucene不提供用户搜索界面
建立查询:用户从搜索界面提交搜索请求,通常以html表单或者ajax请求形式由浏览器提交到搜索引擎服务器,然后将请求转换为搜索引擎使用的查询对象格式。
搜索查询:查询检索索引,并且返回与查询语句相
展示结果:获得匹配查询语句并排好顺序的文档结果集,接下来用直观而且经济的方式为用户展示结果。
 
②建立查询
用户从搜索界面提交一个搜索请求,通常以HTML表单或者Ajax请求的形式由浏览器提交到你的搜索引擎服务器。然后将这个请求转换成搜索引擎使用的查询对象格式,这称为建立查询。
③搜索查询
查询检索索引并返回与查询语句匹配的文档,结果返回时按照查询请求来排序。
④展现结果
一旦获得匹配查询语句并排好序的文档结果集,接下来就得用直观的、经济的方式为用户展现结果。
 
4、索引过程的核心类
 
·IndexWriter
·Directory
·Analyzer
·Document
·Field
 
①IndexWriter
索引过程的核心组件。这个类负责创建新索引或者打开已有索引,以及向索引中添加、删除或更新被索引文档的信息。可以把IndexWriter看作这样一个对象:它为你提供针对索引文件的写入操作,但不能用于读取或搜索索引。IndexWriter需要开辟一定空间来存储索引,该功能可以由Directory完成。
 
②Directory
该类描述了Lucene索引的存放位置。它是一个抽象类,它的子类负责具体指定索引的存储路径。用FSDirectory.open方法来获取真实文件在文件系统的存储路径,然后将它们一次传递给IndexWriter类构造方法。IndexWriter不能直接索引文本,这需要先由Analyzer将文本分割成独立的单词才行。
 
③Analyzer
文本文件在被索引之前,需要经过Analyzer(分析器)处理。Analyzer是由IndexWriter的构造方法来指定的,它负责从被索引文本文件中提取语汇单元,并提出剩下的无用信息。如果被索引内容不是纯文本文件,那就需要先将其转换为文本文档。对于要将Lucene集成到应用程序的开发人员来说,选择什么样Analyzer是程序设计中非常关键的一步。分析器的分析对象为文档,该文档包含一些分离的能被索引的域。
 
④Document
Document对象代表一些域(Field)的集合。文档的域代表文档或者文档相关的一些元数据。元数据(如作者、标题、主题和修改日期等)都作为文档的不同域单独存储并被索引。Document对象的结构比较简单,为一个包含多个Filed对象容器;Field是指包含能被索引的文本内容的类。
 
⑤Field
索引中的每个文档都包含一个或多个不同命名的域,这些域包含在Field类中。每个域都有一个域名和对应的域值,以及一组选项来精确控制Lucene索引操作各个域值。
搜索过程中的核心类
 
6、搜索过程中的核心类
 
·IndexSearcher
·Term
·Query
·TermQuery
·TopDocs
 
 
①IndexSearcher
该类用于搜索由IndexWriter类创建的索引,它是连接索引的中心环节。可以将IndexSearcher类看作是一个以只读方式打开索引的类。它需要利用Directory实例来掌控前期创建的索引,然后才能提供大量的搜索方法。
②Term
Term对象是搜索功能的基本单元。Term对象包含一对字符串元素:域名和单词(或域名文本值)。
③Query
包含了一些非常有用的方法,TermQuery是它的一个子类。
④TermQuery
该类提供最基本的查询,用来匹配指定域中包含特定项的文档。
⑤TopDocs
该类是一个简单的指针容器,指针一般指向前N个排名的搜索结果,搜索结果即匹配查询条件的文档。
 
7、Lucene如何对搜索内容进行建模(文档要存储了才能展示)
 
①文档和域
文档是Lucene索引和搜索的原子单位。文档为包含一个或多个域的容器,而域则依次包含“真正的”被搜索内容。每个域都有一个标识名称,该名称为一个文本值或二进制值。如:用户在输入搜索内容“title:lucene”时,搜索结果则为标题域值包含单词“lucene”的所有文档。
 
Lucene可以针对域进行3种操作:
域值可以被索引。
如果需要搜索一个域,则必须首先对它进行索引。被索引的域值必须是文本格式的(二进制格式的域值只能被存储而不能被索引)。在索引一个域时,需要首先使用分析过程将域值转换为语汇单元,然后将语汇单元加入到索引中。
域被索引后,还可以选择性地存储项向量,后者可以看作该域的一个小型反向索引集合,通过该向量能够检索该域的所有语汇单元。这个机制有助于实现一些高级功能,比如搜索与当前文档相似的文档。
·域值可以被单独存储,即是说被分析前的域值备份也可以写进索引中,以便后续的检索。这个机制可以使你将原始值展现给用户,比如文档的标题或摘要。
【注意】
当搜索程序通过索引检索文档时,只有被存储的域才会被作为搜索结果展现。例如,被索引但未被存储于文档的域是不会被作为搜索结果展现的。这种机制通常会使得搜索结果具有不确定性。
 
②灵活的架构
与数据库不同的是,Lucene没有一个确定的全局模式;Lucene要求在进行索引操作时简单化或反向规格化原始数据。
 
8、Lucene索引的过程:原始文档转换为文本、分析文本、将分析好的文本保存到索引当中。
在索引的操作期间,文本首先从原始的数据中提取出来,用于创建对应的Document实例,该实例包含多个Field实例,都用于保存原始的数据信息。随后分析过程中,将文本处理成大量的语汇单元,最后将语汇单元添加到段结构中。
基本索引操作
 
①向索引添加文档
添加文档的方法有两个:
——addDocument(Document),使用默认分析器添加文档,该分析器在创建IndexWriter对象时指定,用于语汇单元操作
——addDocument(Document , Analyzer),使用指定的分析器添加文档和语汇单元操作。
 
②删除文档
——deleteDocuments(Term)负责删除包含项的所有文档
——deleteDocuments(Term[])
——deleteDocuments(Query)
——deleteDocuments(Query[])
——deleteAll()
通过Term类删除单个文档,需要确认在每个文档中都已索引过对应的Field类,还需要确认所有域值都是以唯一的,这样才能将这个文档单独找出来删除。
注意,如果碰巧指定了一个错误的Term对象(例如,由一个普通的被索引的域文本创建的Term对象,而不是由唯一ID值创建的域),那么Lucene将很容易地快速删除索引中的大量文档。删除操作不会马上执行,而是放入内存缓冲区,Lucene周期性刷新文档目录来执行该操作。不过即使删除操作已完成,存储该文档的磁盘空间也不会马上释放,Lucene只是将该文档标记为“删除”。
 
③更新文档
Lucene更新文档通过先删除整个旧文档,然后向索引中添加新文档来完成。
——updateDocument(Term,Document)首先删除包含Term变量的所有文档,然后使用writer的默认分析器添加新文档。
——updateDocument(Term,Document,Analyzer)同上,区别是可以指定分析器。由于updateDocument方法要在后台调用deleteDocuments方法,因此注意:要确认被更新文档的Term标识的唯一性。
 
 
非结构化数据查询方法
  (1)顺序扫描法(Serial Scanning)
  所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容,只是相当的慢。
  (2)全文检索(Full-text Search)
  将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。
  如:字典。字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据——也即对字的解释。
  这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
  虽然创建索引的过程也是非常耗时的,但是索引一旦创建就可以多次使用,全文检索主要处理的是查询,所以耗时间创建索引是值得的。
 
 可以使用Lucene实现全文检索。Lucene是apache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能。
  应用场景:对于数据量大、数据结构不固定的数据可采用全文检索方式搜索,比如百度、Google等搜索引擎、论坛站内搜索、电商网站站内搜索等。
 
索引与搜索原理
1、绿色表示索引过程,对要搜索的原始内容进行索引构建一个索引库,索引过程包括:
确定原始内容即要搜索的内容-->采集文档-->创建文档-->分析文档-->索引文档
       2、红色表示搜索过程,从索引库中搜索内容,搜索过程包括:
用户通过搜索界面-->创建查询-->执行搜索,从索引库搜索-->渲染搜索结果
 
Document,文档类。在Pylucene中建立索引的基本单位是“文档”(Document),一个Document可能是一个网页、一篇文章、一封邮件。Document是用以构建索引的单位同时也是进行搜索时的结果单位,对它进行合理的设计能够提供个性化的搜索服务。
 
Filed,域类。一个Document之中可以包含多个域(Field)。Filed是Document的组成部分,就如一篇文章的组成可能是文章标题、文章主体、作者、发表日期等多个Filed。
 
摘录自:
 
因为直接用Luence不行,我转战elasticsearch!(包已经装好了明天接着更新实战part)
 
1,分布式的搜索引擎
es可作为一个分布式的搜索引擎,例如百度,淘宝的商品搜索,一般web系统的站内搜索,es都是不错的技术选型。
2,数据分析引擎
es在搜索的基础上提供了丰富的API支持个性化的搜索和数据分析功能,比如电商网站,我们可以查询最近几天的热销商品等。
3,对海量数据进行近实时的处理
es是一个分布式的搜索引擎,es通过集群和内部分片可以将海量数据分散到多台服务器上进行存储和检索,大大提高了其可伸缩性和容灾能力。
所谓近实时是一个相对的概念,一般的如果相应速度能达到秒级别,我们就称为其实近实时的。es的近实时包括两个方面:其一写入的数据在1s后就可以进行检索。其二其检索和分析响应速度可以达到秒级别。
特点:
1、分布式
es是一个分布式的搜索引擎,可以很好的进行数据的容灾迁移,动态扩容,负载均衡等分布式特性。
2、海量数据
es能处理PB级别的数据,因为es是一个分布式的架构,支持动态扩容,所以对于海量数据的处理和存储都不再是问题。
 
 
 
 
 

原文地址:https://www.cnblogs.com/AKsnoopy/p/15178042.html