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.Net 2.3.1开发介绍 —— 二、分词(四),这是一个系列的文档,太多了,只好分开
全文检索介绍 索引 分词 Lucene介绍 Lucene应用详解 索引器 检索器 条件查询 实用工具及高亮器 Lucene综合应用——仿搜索引擎
开发搜索引擎 Lucene Heritrix 随书光盘
c#下实现Lucene时间区间查询匹配。主要还是对Lucene查循对像Query的实现
最后,虽然Lucene使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework[14]),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统...
基于Lucene小型搜索引擎的研究与实现
JSP源码——[搜索链接]java(结合lucene)版的公交搜索系统_javaso.zip
本书深入浅出地介绍了Lucene——一个开源的使用Java语言编写的全文搜索引擎开发包。它通过浅显的语言、大量的图注、丰富的代码示例,以及清晰的结构为读者呈现出作为优秀开源项目的Lucene 所体现的强大功能。全书共...
从淘宝淘来的电子书,站上的多不全的。这个肯定全,但是没代码。 要代码可以从VERYCD上找
lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例lucene实例
开发自己的搜索引擎——Lucene+Heritrix(第2版)_含书(PDF)和光盘内容
lucene入门小例子
[开发自己的搜索引擎——Lucene.Heritrix(第2版)[CD资源包]].Lucene.rar
此博文是对近期做lucene索引的总结, (lucene,solr,netty,hadoop),如蒙加入,不胜感激,大家共同探讨,本人争取每日一博,希望大家关注呦
NULL 博文链接:https://zzc1684.iteye.com/blog/2181330
Lucene可以对任何的数据做索引和搜索. Lucene不管数据源是什么格式,只要它能被转化为文字的形式,就可以被Lucene所分析利用.也就是说不管是MS word, Html ,pdf还是其他什么形式的文件只要你可以从中抽取出文字形式的...
lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....
JSP搜索链接类实例开发源码——java(结合lucene)版的公交搜索系统.zip
Lucene实现全文搜索,支持英文、模糊和智能查询
lucene3.6 搜索例子