luence之全文检索

1.简介:

lucene是一个设计非常优秀的软件,优秀在于简单易用,它屏蔽了复杂的实现过程,只要使用它提供的一些类和相应的api就能进行全文检索,并提供了hits分页功能。是不是很激动?现在我们就一起走进luence吧。微笑

2.下面看一个集成lucene经典案例图

3.有人到这时会问lucene到底会做些什么呢:

其实使用lucene可以在应用程序中添加索引和搜索功能,例如百度,这样可以提高文件检索效率

4.现在就做一个lucene的创建索引和搜索的示例

a.首先建一个普通的javaproject

b.其次在官网下载lucene包把lucene-analyzers-common-4.4.0.jar、lucene-core-4.4.0.jar、lucene-queryparser-4.4.0.jar三个jar导入项目

c.最后献上示例代码

package luence;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.TextField;
import org.apache.lucene.document.Field.Store;
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.index.Term;
import org.apache.lucene.search.FuzzyQuery;
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 CreateIndex {
	/**
	 * dir目录
	 */
	private static Directory dir;
	
	/**
	 * 索引文件存放位置
	 */
	private static final String  pathFile = "E:\\luence";
	
	
	/**
	 * 创建索引 获得IndexWriter对象
	 */
	protected static IndexWriter getWriter() throws Exception {
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
		IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_40,
				analyzer);
		return new IndexWriter(dir, iwc);
	}
	
	/**
	 * 创建索引
	 * @param map
	 */
	public static void createIndex(Map<String, Object> map) {
		System.out.println("createIndex进");
		String text = "";
		System.out.println("createIndexpath=="+pathFile);
		File file = new File(pathFile);
		IndexWriter writer = null;
		try {
			if(!file.isDirectory()){
				file.mkdirs();
			}
			dir = FSDirectory.open(new File(pathFile));
			writer = getWriter();
			// 定义搜索体
			if (map != null) {
				Document doc = new Document();
				for (Entry<String, Object> e : map.entrySet()) {
					text += e.getValue() + " ";
					doc.add(new TextField(e.getKey(), e.getValue().toString(),
							Store.YES));
				}
				doc.add(new TextField("content", text, Store.YES));//content为收缩域
				writer.addDocument(doc);
			}
			System.out.println("content"+"=" + text);
			System.out.println("init ok?");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (writer != null) {
					// 关闭索引
					writer.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 *查询,这里返回的是map集合
	 */
	public static List<Map<String, Object>> createSearch(String content,String searchIndex,String[] strArr) {
		System.out.println("createSearch 进");
		// 定义索引路径
		System.out.println("createSearchpath="+pathFile);
		Directory dir = null;
		IndexReader reader = null;
		List<Map<String, Object>> retuList = new ArrayList<Map<String, Object>>();// 返回结果集
		try {
			dir = FSDirectory.open(new File(pathFile));
			reader = DirectoryReader.open(dir);
			IndexSearcher searcher = new IndexSearcher(reader);
			Term term = new Term(content, searchIndex);
			System.out.println("sarchContent=" + content);
			// 创建模糊查询(还有很多种查询方式这里不再介绍,感兴趣的哥们可以查看相关资料《luence in action》)
			Query query = new FuzzyQuery(term);
			TopDocs topdocs = searcher.search(query, 100);//显示队列的Size为100
			ScoreDoc[] scoreDocs = topdocs.scoreDocs;
			System.out.println("查询结果总数:" + topdocs.totalHits);
			for (int i = 0; i < scoreDocs.length; i++) {
				Map<String, Object> retuMap = new HashMap<String, Object>();// 查询结果map
				int doc = scoreDocs[i].doc;
				Document document = searcher.doc(doc);
				if(strArr != null){
					for (String para : strArr) {
						retuMap.put(para, document.get(para));
						//打印出搜索值(测试)
						System.out.println(para + "=" + document.get(para));
					}
				}
				retuList.add(retuMap);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();//关闭流
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return retuList;
	}
	
	public static void main(String[] args) {
		//一组要创建索引的对象
		List<Map<String,Object>> listMap = new ArrayList<Map<String,Object>>();
		for (int i = 0; i < 6; i++) {
			//初始化对象(这里对象用map集合封装)
			Map<String,Object> map = new HashMap<String, Object>();
			map.put("code", "code" + i);
			map.put("city", "city" + i);
			listMap.add(map);
		}
		//批量创建索引
        for (Map<String, Object> map2 : listMap) {
        	createIndex(map2);
		}
        //查询
        String[] strArr = {"code","city"};
        System.out.println(createSearch("content", "code", strArr));
	}
}

5.把上面代码贴在项目测试即可



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值