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

lucene创建索引读取索引简单测试--笔记

程序员文章站 2022-07-09 13:45:33
...

Lucene

 编辑

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

搜索

编辑
IndexSearcher searcher= new IndexSearcher("E:/index");
Query query = new TermQuery(new Term("title", "lucene"));//单个字节查询
//Query query = new FuzzyQuery(new Term("title", "lucene"));//模糊查询
//Query query = new WildcardQuery(new Term("title", "lu*"));//通配符查询 ?代表一个字符,*代表0到多个字符
//BooleanQuery query = new BooleanQuery();//条件查询
//BooleanQuery qson1 = new BooleanQuery();
//Query q1 = new TermQuery(new Term("title", "lucene"));
//qson1.add(q1, Occur.MUST);//MUST是必须满足的
//BooleanQuery qson2 = new BooleanQuery();
//Query q2= new TermQuery(new Term("sex", "woman"));
//qson2 .add(q2, Occur.MUST_NOT);//MUST_NOT是必须不满足
//query.add(qson1, Occur.SHOULD);
//query.add(qson2, Occur.SHOULD);//SHOULD代表满足qson1或者满足qson2都可以
//PhraseQuery query = new PhraseQuery();//近距离查询
//query.setSlop(5);//距离设置为5
//query.add(new Term("title", "lucene"));
//query.add(new Term("title", "introduction"));//查询出title中lucene和introduction距离不超过5个字符的结果
//Query query = new PrefixQuery(new Term("title", "lu"));//WildcardQuery的lu*一样
//RangeQuery query = new RangeQuery(new Term("time", "50"),new Term("time", "60"), true);
//true代表[50,60],false代表(50,60)
Hits hits = searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
Document d = hits.doc(i);
String title= d.get("title");
System.out.print(title+ " ");
}
这样,基本上就可以使用了
注:以上代码为lucene早些版本的写法。lucene3.02的写法有所改变。

建立索引

编辑
IndexWriter writer = new IndexWriter("E:/index", new StandardAnalyze(),true,MaxFieldLength.UNLIMITED); //true代表覆盖原先数据,maxFieldLength用来限制Field的大小
Document doc = new Document();
doc.add(new Field("title", "lucene introduction", Field.Store.YES, Field.Index.ANALYZED,
Field.TermVector.WITH_POSITIONS_OFFSETS));
doc.add(new Field("time", "60", Field.Store.YES, Field.Index.ANALYZED,
Field.TermVector.WITH_POSITIONS_OFFSETS));
writer.addDocument(doc);
writer.optimize(); //优化
writer.close();

代码案例(lucene5.3)
package lucTest;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;

public class ExtendAllTest {
	
	
	public static void main(String[] args) {
		
		try {
			generate();
			reader();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 生成lucene索引文件
	 * @throws IOException
	 */
	public static void generate() throws IOException{
		//创建分词解析器
		Analyzer analyzer=new CJKAnalyzer();
		//初始化索引写入配置,配置指定的分词器解析规则
		IndexWriterConfig config=new IndexWriterConfig(analyzer);
		//初始化索引写入器,磁盘文件用(FSDirectory)
		//存入存储器用 RAMDirectory ramDir = new RAMDirectory(fileName)
		IndexWriter iw = new IndexWriter(FSDirectory.open(new File("lucene","index").toPath()), config);
		//创建文档,在索引中一个文档便是一条索引记录
		Document doc=new Document();
		//文档由field名称 和需索引内容组成; 设定存储并索引Field.Store.YES
		doc.add(new TextField("filedid", "《物种起源》--达尔文",Field.Store.YES));
		//......
		//.....
		//将文档添加至索引
		iw.addDocument(doc);
		//关闭写入流
		iw.close();
	}
	
	/**
	 * 读取索引文件信息
	 * @throws IOException
	 * @throws ParseException 
	 */
	public static void reader() throws IOException, ParseException{
		//创建索引读取器
		IndexReader ir=DirectoryReader.open(FSDirectory.open(new File("lucene","index").toPath()));
		//创建搜索器
		IndexSearcher search=new IndexSearcher(ir);
		//创建搜索条件解析器,分词器尽量与生成索引时的分词器保持一致
		QueryParser queryparser=new QueryParser("filedid", new CJKAnalyzer());
		//实现对参数信息进行全文检索条件装载
		Query query=queryparser.parse("达尔文");
		//进行搜索,并获得检索结果
		TopDocs docs=search.search(query, 10);
		//遍历读取检索结果集中的详细索引数据
		ScoreDoc scores[]=docs.scoreDocs;
		for(int i=0;i<scores.length;i++){
			int num=scores[i].doc;//查询到的索引id
			Document doc=search.doc(num);//加载到具体某一个文档域
			System.out.println(doc.get("filedid"));
		}
		
	}

}