package Java.se.lucene;
// 主类
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericField;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;
public class Search {
private String[] ids={"1","2","3","4","5","6"};
private String[] emails={"aa@aa.com","bb@bb.com",
"cc@cc.com","dd@dd.com","ee@ee.com","ff@ff.com"};
private String[] contents={"i like gdsfgfds","i like fsdfs","i like fdsfsd",
"i like fdsfsd","i like like fdfs","i like like like fsefsdfg"};
private int[] attachs={1,2,3,4,5,6};
private String[] names={"liwu","zhangsan","xiaoqinag","laona",
"dabao","lisi"};
private IndexWriter writer=null;
private Date[] dates=null;
private Map<String,Float> scores=new HashMap<String,Float>();
private Directory directory=null;
private IndexReader reader=null;
public Search()
{
directory=new RAMDirectory();
setDate();
index();
}
//建立索引
public void index()
{
Document document=null;
try {
writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36,
new StandardAnalyzer(Version.LUCENE_36)));
writer.deleteAll();//更新索引
for(int i=0;i<ids.length;i++)
{
document=new Document();
document.add(new Field("id", ids[i],
Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS ));
document.add(new Field("email",emails[i],
Field.Store.YES,Field.Index.NOT_ANALYZED));
document.add(new Field("content", contents[i],
Field.Store.YES, Field.Index.ANALYZED));
document.add(new Field("name",names[i],
Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
//为数字添加索引
document.add(new NumericField("attach", Field.Store.YES,true).
setIntValue(attachs[i]));
//为日期添加索引
document.add(new NumericField("date", Field.Store.YES,true)
.setLongValue(dates[i].getTime()));//记住要getTime
String str=emails[i].substring(emails[i].lastIndexOf("@")+1);
//System.out.println(str);
if(scores.containsKey(str))
{
document.setBoost(scores.get(str));
}else{
document.setBoost(0.5f);
}
writer.addDocument(document);
writer.commit();//提交writer
}
} catch (CorruptIndexException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (LockObtainFailedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
try {
writer.close();
} catch (CorruptIndexException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//获取searcher
public IndexSearcher getSearcher()
{
try {
if(reader==null)
{
reader=IndexReader.open(directory);
}else {
IndexReader rd=IndexReader.openIfChanged(reader);
if(reader!=null)
{
reader.close();
reader=rd;
}
}
return new IndexSearcher(reader);
} catch (CorruptIndexException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//精确查找
public void searchByTerm(String field,String name,int num)
{
try {
IndexSearcher searcher=getSearcher();
Query query =new TermQuery(new Term(field,name));
TopDocs tds=searcher.search(query, num);
System.out.println("一共查询了:"+tds.totalHits);
for(ScoreDoc sd:tds.scoreDocs)
{
Document doc=searcher.doc(sd.doc);
System.out.println(doc.get("id")+"-->"+doc.get("name")+".."
+"["+doc.get("email")+"]"+"("+doc.get("content")+")"+
"-->"+doc.get("attach")+".."+doc.get("date"));
}
searcher.close();
} catch (CorruptIndexException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//范围查询
public void searchByTermRange(String field,String start,String end,int num){
try {
IndexSearcher searcher=getSearcher();
Query query =new TermRangeQuery(field, start, end, true, true);
TopDocs tds=searcher.search(query, num);
System.out.println("一共查询了:"+tds.totalHits);
for(ScoreDoc sd:tds.scoreDocs)
{
Document doc=searcher.doc(sd.doc);
System.out.println(doc.get("id")+"-->"+doc.get("name")+".."
+"["+doc.get("email")+"]"+"("+doc.get("content")+")"+
"-->"+doc.get("attach")+".."+doc.get("date"));
}
searcher.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//范围查询
public void searchByNumRange(String field,int start,int end,int num){
try {
IndexSearcher searcher=getSearcher();
Query query =NumericRangeQuery.newIntRange(field, start, end, true,true);
TopDocs tds=searcher.search(query, num);
System.out.println("一共查询了:"+tds.totalHits);
for(ScoreDoc sd:tds.scoreDocs)
{
Document doc=searcher.doc(sd.doc);
System.out.println(doc.get("id")+"-->"+doc.get("name")+".."
+"["+doc.get("email")+"]"+"("+doc.get("content")+")"+
"-->"+doc.get("attach")+".."+doc.get("date"));
}
searcher.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//创建日期
public void setDate()
{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-kk");
try {
dates=new Date[ids.length];
dates[0]=sdf.parse("2010-08-17");
dates[1]=sdf.parse("2011-02-17");
dates[2]=sdf.parse("2012-03-17");
dates[3]=sdf.parse("2011-04-17");
dates[4]=sdf.parse("2012-05-17");
dates[5]=sdf.parse("2011-07-17");
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
}
}
//测试类
package Java.se.lucene;
import org.junit.Before;
import org.junit.Test;
public class Test_Search {
private Search search=null;
@Before
public void init()
{
search=new Search();
}
@Test
public void test_search01()
{
search.searchByTerm("content", "like", 6);
}
@Test
public void test_search02()
{
//查询(内容--content) 范围(a-z)
search.searchByTermRange("content","a","z",10);
//查询(内容--name) 范围(a-z)
search.searchByTermRange("content","a","z",10);
//查询(内容--attach) 范围(a-z) 查询不出
search.searchByTermRange("attach","2","6",10);
}
@Test
public void test_search03()
{
//查询(内容--content) 范围(a-z)
search.searchByNumRange("attach",1,4,10);
}
}
分享到:
相关推荐
《开发自己的搜索引擎——Lucene+Heritrix(第2版)_随书光盘.rar》是一个包含资源的压缩包,主要用于帮助读者深入理解并实践搜索引擎的开发。Lucene和Heritrix是两个重要的开源工具,它们在构建搜索引擎的过程中起着...
《开发自己的搜索引擎——Lucene+Heritrix》是一本深入探讨如何构建自定义搜索引擎的书籍,结合了Apache Lucene和Heritrix两个强大的开源工具。Lucene是Java开发的全文检索库,而Heritrix则是一款功能丰富的网络爬虫...
Lucene是一款强大的全文搜索引擎库,广泛应用于各种数据检索场景。在C#环境下,利用Lucene进行时间区间搜索是提高数据检索效率和精确度的重要手段。本篇将深入探讨如何在C#中实现Lucene的时间区间查询匹配,以及涉及...
《Lucene全文搜索:分组、精确查找与模糊查找详解》 在IT行业中,全文搜索引擎的使用越来越广泛,而Apache Lucene作为一款强大的开源全文检索库,深受开发者们的喜爱。它提供了高效的索引和查询功能,使得在海量...
Java搜索工具——Lucene实例总结(一) 在Java开发中,搜索引擎已经成为不可或缺的一部分,而Apache Lucene正是一个强大的全文搜索引擎库。这篇博文将带你深入理解Lucene的基本概念和使用方式,帮助你快速入门并掌握...
Lucene.Net 2.3.1开发介绍 —— 二、分词(四),这是一个系列的文档,太多了,只好分开
6. **查询与过滤**:通过Field,我们可以构建复杂的查询条件,比如根据某个Field的值进行精确匹配,或者对某个Field的值进行范围查询。 7. **性能优化**:选择合适的Field类型和配置,可以显著影响索引速度和查询...
【基于Java的全文索引检索引擎——Lucene】 Lucene是一个用Java编写的开源全文检索引擎库,由Doug Cutting创建并贡献给Apache基金会,成为Jakarta项目的一部分,后来成为Apache软件基金会下的顶级项目。它的主要...
《开发自己的搜索引擎——Lucene.Heritrix(第2版)[CD资源包].Lucene.rar》这个压缩包文件,显然包含的是与构建自定义搜索引擎相关的资源,主要聚焦于两个核心工具:Lucene和Heritrix。这两者在信息技术领域,特别是...
《开发自己的搜索引擎——Lucene+Heritrix(第2版)》是一本深入探讨如何构建搜索引擎的专著,其中包含了Lucene和Heritrix两个关键工具的详细使用指南。这本书旨在帮助开发者理解搜索引擎的工作原理,并提供实践性的...
Lucene是一个全文搜索引擎库,它提供了强大的文本搜索功能,被广泛应用于各种信息检索系统中。这本书详细介绍了Lucene的核心概念、API以及实际应用案例,帮助读者快速理解和掌握Lucene的使用。 在"lucene_demo"这个...
2. **查询解析与执行**:Lucene支持各种查询语法,如布尔查询、短语查询、范围查询等。新版本可能对查询解析器进行了改进,提高了查询性能和用户友好性。 3. **分词与分析**:Lucene包含了一系列分词器和分析器,...
在"Lucene全文搜索_LuceneJava全文搜索_"这个主题中,我们将深入探讨Lucene如何在Java环境中实现高效的全文搜索引擎。首先,Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)和搜索(Search)。...
在本压缩包中,包含了Lucene的最新版本——4.10.2的所有相关jar包,总计59个,这些jar包构成了Lucene的核心组件以及各种扩展模块。 首先,我们来看看核心组件`lucene-core-4.10.2.jar`。这个包是Lucene的基础,包含...
系统的核心功能——公交线路搜索,依赖于Lucene的查询引擎。用户输入的查询字符串被解析为查询分析器(Query Parser)所能理解的形式,然后查询引擎通过索引查找匹配的文档。为了提供更精确的搜索结果,系统可能还...
**Lucene 搜索引擎实现详解** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会维护。它提供了一套强大的数据结构和算法,用于高效地存储和检索大量文本数据。通过 Lucene,开发者可以轻松地在自己的应用...
### 利用Lucene实现高级搜索的关键知识点 #### Lucene简介 ...总之,Lucene提供了丰富的搜索功能,包括布尔操作符、域搜索、通配符搜索、模糊查询和范围搜索,使开发者能够根据具体需求定制高级搜索应用。
Lucene中的Filter可以对搜索结果进行过滤,从而获得更小范围内更精确的结果。下面是一个示例代码: ```java filter filter = new DateFilter(fielddate, datetime.parse("2005-10-1"), datetime.parse("2005-10-30...