package com.lucene.LuceneTest.memery;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanClause.Occur;
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.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class AppIndex {
private Directory directory;
public AppIndex() throws Exception {
directory=FSDirectory.open(new File("E:/index/appIndex"));
}
public IndexWriter getWriter() throws Exception{
return new IndexWriter(directory,new StandardAnalyzer(Version.LUCENE_30),false,IndexWriter.MaxFieldLength.UNLIMITED);
}
//初始化索引
public void initIndex() throws Exception{
IndexWriter writer=new IndexWriter(directory,new StandardAnalyzer(Version.LUCENE_30),true,IndexWriter.MaxFieldLength.UNLIMITED);
File[] files=new File("D:/test_data/result1").listFiles();
for(int i=0;i<files.length;i++){
File f=files[i];
System.out.println(f.getName());
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f)));
String line="";
br.readLine();
while((line=br.readLine())!=null){
String[] arrStr=line.split("\",\"");
if(arrStr.length>3){
Document doc=new Document();
doc.add(new Field("appid",arrStr[0].replaceAll("\"", "").trim(),Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(new Field("onlineDay",arrStr[1].trim(),Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(new Field("sellerUrl",arrStr[2].trim(),Field.Store.YES,Field.Index.NO));
doc.add(new Field("sellerName",arrStr[7].trim(),Field.Store.YES,Field.Index.ANALYZED));
//发布时间
String dateStr=arrStr[6].replaceAll("[TZ]", " ").trim();
doc.add(new Field("releaseDate",dateStr,Field.Store.YES,Field.Index.NOT_ANALYZED));
writer.addDocument(doc);
}
}
}
writer.close();
System.out.println("总共索引"+writer.numDocs()+"条!");
}
//添加文档
public int addDocument(Document doc) throws Exception{
IndexWriter writer=getWriter();
writer.addDocument(doc);
writer.close();
return writer.numDocs();
}
//删除文档
public int removeDocument(String appid) throws Exception{
IndexWriter writer=getWriter();
System.out.println(writer.numDocs());
Term term=new Term("appid",appid);
writer.deleteDocuments(term);
writer.commit();
int delNum=writer.maxDoc()-writer.numDocs();
writer.optimize();//优化合并
writer.close();
return delNum;
}
public void updateDoc(String updateStr) throws Exception{
IndexWriter writer=getWriter();
System.out.println("numDocs"+writer.numDocs());
String[] cons=updateStr.split("\\|");
String s=updateStr.substring(updateStr.indexOf("appid=")+6);
String appid=s.substring(0,s.indexOf("|")).replaceAll("\"","");
System.out.println("appid-->"+appid);
for(Document doc:this.searchDoc("appid="+appid)){
for(int i=0;i<cons.length;i++){
String[] unitStr=cons[i].split("=");
Store store=Field.Store.YES;
Index index=Field.Index.ANALYZED;
if("sellerName".equals(unitStr[0])){
store=Field.Store.YES;
index=Field.Index.ANALYZED;
// doc.removeField("sellerName");
}else if("sellerUrl".equals(unitStr[0])){
store=Field.Store.YES;
index=Field.Index.NOT_ANALYZED;
// doc.removeField("sellerUrl");
}else if("releaseDate".equals(unitStr[0])){
store=Field.Store.YES;
index=Field.Index.NOT_ANALYZED;
// doc.removeField("releaseDate");
}else if("onlineDay".equals(unitStr[0])){
store=Field.Store.YES;
index=Field.Index.NOT_ANALYZED;
// doc.removeField("onlineDay");
}
if(!"appid".equals(unitStr[0])){
Field field=new Field(unitStr[0],unitStr[1].replaceAll("\"", "").trim(),store,index);
doc.add(field);
}
}
writer.updateDocument(new Term("appid",appid), doc);
writer.commit();
}
System.out.println("numDocs"+writer.numDocs());
writer.close();
}
//搜索文档
public List<Document> searchDoc(String condition) throws Exception{
//搜索
IndexSearcher searcher=new IndexSearcher(this.directory);
// QueryParser parser=new QueryParser(Version.LUCENE_30,"sellerName",new StandardAnalyzer(Version.LUCENE_30));
// Query query=parser.parse(condition);
String[] cons=condition.split("\\|");
//
String[] fields=new String[cons.length];
String[] queries=new String[cons.length];
Occur[] clauses=new Occur[cons.length];
for(int i=0;i<cons.length;i++){
String[] unitQ=cons[i].split("=");
fields[i]=unitQ[0];
queries[i]=unitQ[1].replaceAll("\"", "").trim();
clauses[i]=BooleanClause.Occur.SHOULD;
System.out.println(unitQ[0]+" | "+unitQ[1].replaceAll("\"", "").trim());
}
Query query = MultiFieldQueryParser.parse(Version.LUCENE_30, queries, fields, clauses, new StandardAnalyzer(Version.LUCENE_30));
TopDocs tds= searcher.search(query,10);
List<Document> list=new ArrayList<Document>();
ScoreDoc[] scoreDocs=tds.scoreDocs;
for(int i=0;i<scoreDocs.length;i++){
list.add(searcher.doc(scoreDocs[i].doc));
}
System.out.println(tds.totalHits);
searcher.close();
return list;
}
public static void main(String[] args) throws Exception {
AppIndex appIndex=new AppIndex();
// appIndex.initIndex();
Scanner input=new Scanner(System.in);
while(true){
System.out.println("输入1添加索引 输入2搜索 输入3删除指定appid文档 输入4更新\n");
int flag=input.nextInt();
switch(flag){
case 1:
System.out.println("输入以下字段用空格格开[appid,onlineDay,sellerUrl,sellerName,releaseDate]\n\n");
String appid=input.next();
String onlineDay=input.next();
String sellerUrl=input.next();
String sellerName=input.next();
String releaseDate=input.next();
Document doc=new Document();
doc.add(new Field("appid",appid,Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(new Field("onlineDay",onlineDay,Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(new Field("sellerUrl",sellerUrl,Field.Store.YES,Field.Index.NO));
doc.add(new Field("sellerName",sellerName,Field.Store.YES,Field.Index.ANALYZED));
//发布时间
doc.add(new Field("releaseDate",releaseDate,Field.Store.YES,Field.Index.NOT_ANALYZED));
int indexNum=appIndex.addDocument(doc);
System.out.println("添加成功!共有索引["+indexNum+"]个");
break;
case 2:
System.out.println("请输入查询条件:appid=\"\"|onlineDay=\"\"|sellerUrl=\"\"|sellerName=\"\"|releaseDate=\"\"");
String condition=input.next();
List<Document> list=appIndex.searchDoc(condition);
System.out.println(list.size());
for(Document d:list){
for(Field f:d.getFields("onlineDay")){
System.out.println(f.stringValue());
}
System.out.println("[appid="+d.get("appid")+",onlineDay="+d.get("onlineDay")+",sellerUrl="+d.get("sellerUrl")+",sellerName="+d.get("sellerName")+",releaseDate="+d.get("releaseDate")+"]");
}
break;
case 3:
System.out.println("请输入appid\n");
appid=input.next();
int delNum=appIndex.removeDocument(appid);
System.out.println("删除"+delNum+"条!");
break;
case 4:
System.out.println("请输入更新字段和值:appid=\"\"|onlineDay=\"\"|sellerUrl=\"\"|sellerName=\"\"|releaseDate=\"\"");
String updateStr=input.next();
appIndex.updateDoc(updateStr);
break;
default:
System.out.println("命令不对重新输入");
}
}
}
}
分享到:
相关推荐
《Lucene CRUD操作详解》 在信息技术领域,搜索引擎技术扮演着至关重要的角色,Apache Lucene就是这样一款强大的全文搜索引擎库。本篇文章将深入探讨如何在Java环境中,利用Hibernate和Struts2框架实现Lucene的CRUD...
lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....
lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0
【Lucene 4.7.0 全套JAR包详解】 Lucene是一个开源全文搜索引擎库,由Apache软件基金会开发并维护。它提供了一个高级、灵活的文本搜索API,允许开发者轻松地在应用程序中实现复杂的搜索功能。这次提供的“lucene-...
本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...
Lucene是一款强大的全文搜索引擎库,广泛应用于各种数据检索场景。在C#环境下,利用Lucene进行时间区间搜索是提高数据检索效率和精确度的重要手段。本篇将深入探讨如何在C#中实现Lucene的时间区间查询匹配,以及涉及...
《Lucene in Action》是关于Apache Lucene的权威指南,这本书深入浅出地介绍了全文搜索引擎的构建和优化。Lucene是一个高性能、全文本搜索库,它允许开发人员在应用程序中轻松实现复杂的搜索功能。这本书主要面向...
在IT领域,搜索引擎技术是至关重要的,而Lucene作为一个开源全文搜索引擎库,广泛应用于各种文本检索系统中。本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、...
《Annotated Lucene 中文版 Lucene源码剖析》是一本深入探讨Apache Lucene的书籍,专注于源码解析,帮助读者理解这个强大的全文搜索引擎库的工作原理。Lucene是一款开源的Java库,它提供了高效的文本搜索功能,被...
【Lucene 简介】 Lucene 是一个强大的开源全文搜索库,由 Java 编写,主要用于为应用程序添加全文检索功能。它不是一个完整的全文搜索引擎应用,而是一个工具包,允许开发者将其集成到自己的软件中,以实现高效、...
**Lucene原理详解** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单但功能强大的API,用于索引和搜索文本数据,使得开发者可以轻松地在...
**Lucene 2.0 API 和 Lucene 3.0 API 深度解析** Lucene 是一个由 Apache 软件基金会开发的全文搜索引擎库,它为开发者提供了在 Java 应用程序中实现高性能、可扩展的全文搜索功能的能力。Lucene 的 API 设计得相当...
《全面解析Lucene jar包:从基础到应用》 在信息技术高速发展的今天,搜索引擎已经成为我们获取信息不可或缺的工具。在Java领域,Lucene作为一个强大的全文搜索引擎库,深受开发者喜爱。本文将详细介绍“lucene所有...
《Lucene in Action 第二版》是一本深入探讨Apache Lucene全文检索库的专业书籍,它在Java开发领域具有很高的权威性。这本书详细介绍了如何利用Lucene进行高效的文本搜索和索引构建,是Java开发者和信息检索爱好者的...
赠送jar包:lucene-core-7.7.0.jar; 赠送原API文档:lucene-core-7.7.0-javadoc.jar; 赠送源代码:lucene-core-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.7.0.pom; 包含翻译后的API文档:lucene...
《Lucene与关系型数据库对比:深度解析与应用探索》 在信息爆炸的时代,数据管理和检索成为了企业乃至个人日常工作中不可或缺的部分。随着技术的发展,不同的数据处理方式应运而生,其中Lucene与关系型数据库作为两...
标题"Lucene资料大全(包括Lucene_in_Action书等)"表明这是一个包含全面Lucene学习资源的集合,其中最显著的是《Lucene_in_Action》这本书。这是一本广泛认可的关于Apache Lucene的权威指南,通常被简称为LIA,它深入...
Apache Lucene是一个开源全文搜索引擎库,它为Java开发者提供了强大的文本搜索功能。在这个"Lucene 5 主要jar包"中,我们找到了一系列与Lucene 5.0.0相关的jar文件,这些文件是构建和运行基于Lucene的搜索应用程序的...
**Lucene.NET 中文分词技术详解** Lucene.NET 是一个高性能、全文检索库,它是Apache Lucene项目在.NET平台上的实现。作为一个开源的搜索引擎框架,Lucene.NET为开发者提供了强大的文本搜索功能。而在处理中文文档...