最近跟着师兄们做个项目,我的任务就是负责做个“全文检索”的小模块。用到了Lucene的索引,下面的是其中的用Lucene实现在索引的一个字段(比如文章内容字段)进行查找多个关键字的实例代码。
1.Lucene说明
Lucene是非常优秀的成熟的开源的免费的纯java语言的全文索引检索工具包。
Lucene的的强项在“建立索引”和”搜索“,而不是实现具体的”分词“。Lucene支持对生成索引的进行”增,删,改,查“操作,这比自己建立的索引有了很大的进步。
可以使用专门的分词程序进行分词,在分词的结果上用Lucene建立索引。
2.用Lucene实现在一个或者多个字段中的检索
主要是函数:MultiFieldQueryParser.parse(String[] query,String[] field,Occur[] occ,Analyzer analyzer);
1)query:要查找的字符串数组
2)field:要查找的字符串数组对应的字段(当然有可以相同的)
3)occ:表示对应字段的限制。有三种:Occur.MUST(必须有), Occur.MUST_NOT(必须没有),Occur.SHOULD(应该)
4)analyzer:对查询数据的分析器,最好与建立索引时用的分析器一致
3.代码示例
下面这个程序可以实现在一个字段“contents”中查找多个关键字。稍加修改也可以在多个字段查找多个关键字。
import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; public class MultiPhraseQuerySearcher { private static String indexPath = "E:\\Lucene\\index"; // 索引保存目录 public static void createIndex(){ // 建立索引 IndexWriter writer; try { writer = new IndexWriter(indexPath,new StandardAnalyzer(),true); Field fieldB1 = new Field("contents","今晚的辩题很道地:在我们这些人当中?",Field.Store.YES,Field.Index.TOKENIZED); Field fieldB2 = new Field("contents","我们为电影《今朝》是一部不错的影片。",Field.Store.YES,Field.Index.TOKENIZED); Field fieldB3 = new Field("contents","我们到底是啥意思呢?",Field.Store.YES,Field.Index.TOKENIZED); Document doc1 = new Document(); Document doc2 = new Document(); Document doc3 = new Document(); doc1.add(fieldB1); doc2.add(fieldB2); doc3.add(fieldB3); writer.addDocument(doc1); writer.addDocument(doc2); writer.addDocument(doc3); writer.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { //contests字段上查找含有"我们","今晚"这两个字段的Doument Query query; IndexSearcher searcher; try { //生成索引 createIndex(); searcher = new IndexSearcher(indexPath); //要查找的字符串数组 String [] stringQuery={"我们","今晚"}; //待查找字符串对应的字段 String[] fields={"contents","contents"}; //Occur.MUST表示对应字段必须有查询值, Occur.MUST_NOT 表示对应字段必须没有查询值 Occur[] occ={Occur.MUST,Occur.MUST}; query=MultiFieldQueryParser.parse(stringQuery,fields,occ,new StandardAnalyzer()); Hits hits = searcher.search(query); for(int i=0;i<hits.length();i++) System.out.println("Document内容为 : "+hits.doc(i)); System.out.println("共检索出符合条件的Document "+hits.length()+" 个。"); } catch (Exception e) {} } }
相关推荐
Lucene是一个高性能、全文本搜索引擎库,它为开发者提供了在Java应用程序中实现全文搜索功能的基本工具。Nutch则是一个开源的网络爬虫项目,用于抓取互联网上的网页并建立索引。在这篇学习笔记中,我们将探讨如何...
- **文档**:在LUCENE中,每个文档对应一个独立的信息单元,可以是网页、文本文件等,文档由多个字段(Field)组成,如标题、正文等。 - **字段**:字段是文档的组成部分,具有特定的属性,如是否可被搜索或存储。...
每个`Document`对象可以包含多个`Field`对象,每个`Field`对象代表了文档中的一个字段。例如: ```java Document doc = new Document(); doc.add(new Field("NAME", "USERNAME", Field.Store.YES, Field.Index.UN_...
标题和描述中提到的知识点是关于Lucene全文检索数据库的应用示例,特别是在处理大量数据和多表查询时的性能优化。下面将详细阐述Lucene的基本概念、如何在Java环境中使用Lucene进行全文检索,以及结合MySQL数据库的...
- **文档(Document)**: 在Lucene中,每个文档表示一个独立的信息单元,可以包含多个字段(Field),如标题、正文等。 - **字段(Field)**: 文档由多个字段组成,每个字段都有特定的类型,如“text”用于全文本...
2. **文档(Document)**:在Lucene中,文档是存储和检索的基本单位,可以包含多个字段(Field),如标题、内容、作者等。每个字段都有自己的名称和值,并可以选择是否参与索引和搜索。 3. **字段(Field)**:字段...
1. **“中华AND共和国”与“中华共和国”的区别**:由于Lucene默认使用标准分词器,它会将连续的字母数字序列视为一个词条,因此“中华AND共和国”会被分词为“中华”、“AND”和“共和国”,而“中华共和国”则被...
1. **文档(Document)**:在Lucene中,每个需要被搜索的信息单元被视为一个文档。文档由多个字段(Field)组成,每个字段具有特定的名称和内容,例如标题、正文、作者等。 2. **字段(Field)**:字段是文档的组成...
2. **字段与文档**:在 Lucene 中,每个文档可以包含多个字段,比如标题、内容、作者等。每个字段可以有不同的分析器(Analyzer),用于不同的处理规则。 3. **查询解析**:用户输入的查询字符串会被解析成 Lucene ...
- **Field**:存储在Document中的键值对,每个Field包含一个字符串键和一个字符串值。 3. **互联网搜索结构**: - 用户通过搜索引擎访问的是索引库而非直接的网页。 - 索引库包含索引号和文档摘要。 - 用户首次...
- **文档(Document)**: Lucene中的文档相当于存储信息的基本单元,可以包含多个字段(Field),每个字段有自己的名称和内容,比如标题、正文、作者等。 - **字段(Field)**: 字段是文档的组成部分,具有特定的...
- **多字段搜索**:可以同时在多个字段上进行查询。 - **模糊查询**:支持通配符、短语查询和近似查询。 - **评分系统**:根据查询词在文档中的频率和位置计算相关性得分。 - **高亮显示**:对搜索结果的关键词...
每个Document可以包含多个Field,每个Field对应于原始记录中的一个属性,如标题、正文或日期等。Field有两种主要属性: - **存储**:控制是否将Field的值存储在索引文件中,以便于检索时能够直接获取。 - **索引...
传入一个或多个字段名和查询字符串,QueryParser会自动处理布尔运算符、短语匹配等。例如,`QueryParser.Parse("字段1:关键字1 AND 字段2:关键字2")`将返回一个表示两个条件的布尔查询。 2. **...
Lucene是一个高性能、全文本搜索库,而Elasticsearch则是在Lucene的基础上构建的一个分布式、RESTful风格的搜索和数据分析引擎。两者在面试中常常被提及,以下是对这两个技术的关键知识点的深入解析。 首先,Lucene...
具体来说,每个词项都会关联一个文档列表(称为**倒排列表**),列表中的每个条目包含了该词项在文档中出现的位置等信息。此外,索引还可能包含其他元数据,如词频、文档长度等。 ##### 如何创建索引? 1. **原始...
Lucene 是一个实现了全文检索概念的Java库,提供了一套完整的文本检索框架。它支持索引创建、更新和查询,并且可以与其他系统集成。使用Lucene,开发者可以通过API实现对索引库的CRUD操作。 ### 4. Lucene 结构 ...
1. **索引**: Lucene首先对文档进行索引,这个过程相当于创建一个倒排索引,它将文档中的词与对应的文档位置关联起来,便于快速查找。 2. **分词器**: 在索引过程中,分词器(Analyzer)负责将输入文本拆分成有意义...