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"));//模糊查询
//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"));
}
}
}
上一篇: python实现任意字符串矩阵加解密