Hello Lucene
博客专区 > Canaan_ 的博客 > 博客详情
Hello Lucene
Canaan_ 发表于2年前
Hello Lucene
  • 发表于 2年前
  • 阅读 106
  • 收藏 8
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: version: lucene_5.4.0 java7 tomcat7

前言:

    使用lucene主要的几步骤:

准备(创建索引):

  1. 创建索引目录
  2. 选用构建分词解析器
  3. 构建写索引器
  4. 将数据库的表记录,文件系统的文本,或其它的数据封装成一个Document
  5. 解析Document最终生成索引

使用(查询):

  1. 构建读索引器(指定索引目录)
  2. 索引查询器
  3. 选用构建分词解析器
  4. 构建查询对象Query
  5. 索引查询器根据Query对象得到查询结果

使用lucene要把大部分的精力放在创建索引这块

code:

创建索引:


import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public static void init() throws IOException {
		/**
		 * step 1
		 * 创建Directory索引文件存放目录
		 */
		Path path = Paths.get("F:/lucene/index");	
		Directory directory = FSDirectory.open(path);
		
		/**
		 * step 2
		 * 选用构建分词解析器
		 */
		CharArraySet stopword = new CharArraySet(200, true);//除去不必构建索引的词
		stopword.add("是,的,我,们,你,他,那,这,它".split(","));
		Analyzer analyzer = new SmartChineseAnalyzer(stopword);
				                                                      
		/**
		 * step3 
		 * 构建写索引器
		 */
		IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
		IndexWriter writer = new IndexWriter(directory, iwc);
		writer.deleteAll();//清空索引
		
		/**
		 * step4 & stpe5
		 * 将数据库的表记录,文件系统的文本,或其它的数据封装成一个Document,
		 * 并通过写索引器解析Document生成索引文件
		 */
		File doc = new File("F:/lucene/doc");//源文件
		for (File file : doc.listFiles()) {
			System.out.println(String.format("read file : %s", file.getName()));
			Document document = new Document();
			document.add(new TextField("title", file.getName(), Field.Store.YES)); //文章的标题
            document.add(new TextField("contents", new FileReader(file)));  //文章的内容
            document.add(new StringField("path", file.getAbsolutePath(), Field.Store.YES)); //文章的地址
            writer.addDocument(document);  
		}
		writer.close();
	}


查询:


import java.io.IOException;
import java.nio.file.Paths;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
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.Directory;
import org.apache.lucene.store.FSDirectory;

public static ScoreDoc[] query(String key) throws IOException, ParseException{
		/**
		 * stpe1
		 * 构建读索引器(指定索引目录)
		 */
		Directory directory = FSDirectory.open(Paths.get("F:/lucene/index"));//索引文件存放目录
		IndexReader indexReader = DirectoryReader.open(directory);
		
		/**
		 * stpe2
		 * 查询器
		 */
		IndexSearcher searcher = new IndexSearcher(indexReader);
		
		/**
		 * stpe3
		 * 选用构建分词解析器,要和创建索引时的分析器一致
		 */
		Analyzer analyzer = new SmartChineseAnalyzer();
		
		/**
		 * step4 
		 * 创建Query
		 * key: 查询关键字
		 * contents:只在文章内容中配置查询(这是你创建索引时指定的域名).
		 * 所有你也可以指定“title”即按标题查询,当然lunene提交多域查询
		 */
		QueryParser queryParser = new QueryParser("contents", analyzer);
		Query query = queryParser.parse(key);
		
		/**
		 * step 5 
		 *  查询得到查询结果
		 */
		TopDocs topDocs = searcher.search(query, 10);
		indexReader.close();
		return topDocs.scoreDocs;
	}


根据业务来处理得到的结果


ScoreDoc[] hits =  query("lucene文章");
for (ScoreDoc scoreDoc : hits) {
	int docId = scoreDoc.doc;
	Document d = indexSearcher.doc(docId);
	System.out.println(String.format("文章名字:%s /t 路径:%s", d.get("title"),d.get("path")));
}




共有 人打赏支持
粉丝 10
博文 169
码字总数 82307
×
Canaan_
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: