Lucene进阶操作,单字段、多字段和布尔搜索

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/starjuly/article/details/77718983

上一篇文章是入门,现在是进阶,通过项目用到的例子给大家呈现较好的方法。本方法基于Lucene-4.7.2因为项目要用到JDK1.6。

这里使用几个很好用的类,是经过多次试验整理出来的,分别是单字段搜索,多字段搜索以及布尔搜索。

1 单字段搜索

package com.rbc.hbms.search.util.lucene;


import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.IntField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
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.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLEncoder;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import com.rbc.hbms.estateView.entity.HbmsHouse;
import com.tds.framework.wsmanage.util.StringUtils;

/**
 * 布尔搜索
 * Created by MoSon on 2017/7/5.
 */
public class ATermQuery {

	public static void main(String[] args) throws IOException, ParseException {
		 List<HbmsHouse> address = getAddressById("114955758");
		 System.out.println(address);
	}

	/**
	 * 根据id查询
	 * @param address  要查询地址
	 * @param number
	 * @return
	 * @throws IOException
	 * @throws ParseException
	 */
	public static List<HbmsHouse> getAddressById(String keyword) throws IOException, ParseException {
		try {
			long start = System.currentTimeMillis();
			System.out.println("开始时间:" + start);
			// 定义索引目录
			// Path path = FileSystems.getDefault().getPath("standardIndex");
			// Directory directory = FSDirectory.open(path);
			Directory directory = FSDirectory.open(new File("D:/EclipseWorkspace/zseboss/standardIndex"));
			// 定义索引查看器
			IndexReader indexReader = DirectoryReader.open(directory);
			// 定义搜索器
			IndexSearcher indexSearcher = new IndexSearcher(indexReader);
			// 搜索内容
			// 定义查询字段
			/*Term term = new  Term("id",id);
			Query query = new TermQuery(term);*/
			
//			IKAnalyzer analyzer = new IKAnalyzer();// 使用IK分词器
			StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_47);//定义分词器(标准分词器)
		     QueryParser parser = new QueryParser(Version.LUCENE_47,"id", analyzer); //定义查询分析器
		     Query query = parser.parse(keyword);
		     
			
			/**定义高亮组件*/
			SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<span style='color:red;'>", "</span>");
			// 构建Scorer,用于选取最佳切片
			QueryScorer scorer = new QueryScorer(query);
			// 实例化Highlighter组件
			Highlighter highlighter = new Highlighter(formatter, scorer);
			// 构建Fragmenter对象,用于文档切片
			highlighter.setTextFragmenter(new SimpleFragmenter(100));
			highlighter.setEncoder(new SimpleHTMLEncoder());

			// 定义要获取的数量
			// 命中前20条文档
			TopDocs topDocs = indexSearcher.search(query, 1);
			// 打印命中数
//			System.out.println("命中数:" + topDocs.totalHits);
			// 取出文档
			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
			StringBuilder stringBuilder = new StringBuilder();
			// 遍历取出数据

			List<HbmsHouse> list = new LinkedList<HbmsHouse>();
			for (ScoreDoc scoreDoc : scoreDocs) {
				HbmsHouse hh = new HbmsHouse();
				float score = scoreDoc.score; // 相似度
				// System.out.println("相似度:"+ score);
				// 通过indexSearcher的doc方法取出文档
				Document doc = indexSearcher.doc(scoreDoc.doc);
					
				// 获取id
				String id = doc.get("id");
				if(id == null){
					continue;
				}
				//从索引中获取值
				String ngName = doc.get("ngName");
				String town = doc.get("town");
				String pianQu = doc.get("pianQu");
				String switchInType = doc.get("switchInType");
				String addressType = doc.get("addressType");
				String flag = doc.get("flag");
				String causes = doc.get("causes");
				String crtTime = doc.get("crtTime");
				
				//判断是否为空
	        	if(StringUtils.isNotBlank(ngName)){
	        		hh.setNgName(ngName);
	        	}
	        	if(StringUtils.isNotBlank(town)){
	        		hh.setTown(town);
	        	}
	        	if(StringUtils.isNotBlank(pianQu)){
	        		hh.setPianQu(pianQu);
	        	}
	        	if(StringUtils.isNotBlank(switchInType)){
	        		hh.setSwitchInType(switchInType);
	        	}
	        	if(StringUtils.isNotBlank(addressType)){
	        		hh.setAddressType(addressType);
	        	}
	        	if(flag!=null ){
	        		hh.setFlag(Integer.parseInt(flag));
	        	}
	        	if(StringUtils.isNotBlank(causes)){
	        		hh.setCauses(causes);
	        	}
				
				if (StringUtils.isNotBlank(crtTime)) {
					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
					Date parse = sdf.parse(crtTime);
					hh.setCrtTime(parse);
				}

				// 获取地址
				String name = doc.get("name");
				hh.setName(name);

				// 高亮
				String idHighlighter = highlighter.getBestFragment(analyzer, "id", id);
//				 System.out.println("id(高亮):"+idHighlighter);
//				 System.out.println(name);
				hh.setId(idHighlighter);
				list.add(hh);
			}
			System.out.println(stringBuilder.toString());
			// 关闭索引查看器
			indexReader.close();
			long end = System.currentTimeMillis();
			System.out.println("开始时间:" + end);
			long time = end - start;
			System.out.println("用时:" + time + "毫秒");
			return list;
		} catch (InvalidTokenOffsetsException e) {
			e.printStackTrace();
		} catch (java.text.ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	
}

2 布尔搜索

package com.rbc.hbms.search.util.lucene;

import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLEncoder;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import com.rbc.hbms.estateView.entity.HbmsHouse;
import com.tds.framework.wsmanage.util.StringUtils;

/**
 * 布尔搜索
 * Created by MoSon on 2017/7/5.
 */
public class BooleanSearchQuery {

	public static void main(String[] args) throws IOException, ParseException {
		// List<LinkedHashMap<String, Object>> address =
		// getAddress("煲sjfdkla街道",20);
		// System.out.println(address);
	}

	/**
	 * 获取符合的地址
	 * 
	 * @param address
	 *            要查询地址
	 * @param number
	 * @return
	 * @throws IOException
	 * @throws ParseException
	 */
	public static List<HbmsHouse> getAddress(String address, int number) throws IOException, ParseException {
		try {
			long start = System.currentTimeMillis();
			System.out.println("开始时间:" + start);
			// 定义索引目录
			// Path path = FileSystems.getDefault().getPath("standardIndex");
			// Directory directory = FSDirectory.open(path);
			Directory directory = FSDirectory.open(new File("D:/EclipseWorkspace/zseboss/standardIndex"));
			// 定义索引查看器
			IndexReader indexReader = DirectoryReader.open(directory);
			// 定义搜索器
			IndexSearcher indexSearcher = new IndexSearcher(indexReader);
			// 搜索内容
			// 定义查询字段

			/**
			 * 进阶 多关键字的布尔搜索
			 */
			// 定义Term集合
			List<Term> termList = new ArrayList<Term>();
			StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_47);
//			IKAnalyzer analyzer = new IKAnalyzer();// 使用IK分词器
			// 获取分词结果
			List<String> analyseResult = getAnalyseResult(address, analyzer);
			for (String result : analyseResult) {
				termList.add(new Term("ngName", result));
				// System.out.println(result);
			}
			// 定义TermQuery集合
			List<TermQuery> termQueries = new ArrayList<TermQuery>();
			// 取出集合结果
			for (Term term : termList) {
				termQueries.add(new TermQuery(term));
			}
			// 布尔搜索
			BooleanQuery query = new BooleanQuery();
			List<BooleanClause> booleanClauses = new ArrayList<BooleanClause>();
			// 遍历
			for (TermQuery termQuery : termQueries) {
				booleanClauses.add(new BooleanClause(termQuery, BooleanClause.Occur.SHOULD));
			}
			// BooleanQuery.Builder builder = new BooleanQuery.Builder();
			for (BooleanClause booleanClause : booleanClauses) {
				// builder.add(booleanClause);
				query.add(booleanClause);
			}
			// 检索
			// BooleanQuery query = builder.build();

			/**定义高亮组件*/
			SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<span style='color:red;'>", "</span>");
			// 构建Scorer,用于选取最佳切片
			QueryScorer scorer = new QueryScorer(query);
			// 实例化Highlighter组件
			Highlighter highlighter = new Highlighter(formatter, scorer);
			// 构建Fragmenter对象,用于文档切片
			highlighter.setTextFragmenter(new SimpleFragmenter(100));
			highlighter.setEncoder(new SimpleHTMLEncoder());

			// 定义要获取的数量
			// 命中前20条文档
			TopDocs topDocs = indexSearcher.search(query, number);
			// 打印命中数
			System.out.println("命中数:" + topDocs.totalHits);
			// 取出文档
			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
			// 遍历取出数据
			List<HbmsHouse> list = new LinkedList<HbmsHouse>();
			for (ScoreDoc scoreDoc : scoreDocs) {
				HbmsHouse hh = new HbmsHouse();
				float score = scoreDoc.score; // 相似度
				// System.out.println("相似度:"+ score);
				// 通过indexSearcher的doc方法取出文档
				Document doc = indexSearcher.doc(scoreDoc.doc);
					
				// 获取id
				String id = doc.get("id");
				if(id == null){
					continue;
				}
				String ngName = doc.get("ngName");
				String town = doc.get("town");
				String pianQu = doc.get("pianQu");
				String switchInType = doc.get("switchInType");
				String addressType = doc.get("addressType");
				String flag = doc.get("flag");
				String causes = doc.get("causes");
				String crtTime = doc.get("crtTime");
				
				// 高亮
				
			/*	String idHighlighter = highlighter.getBestFragment(analyzer, "id", id);
				String ngNameHighlighter = highlighter.getBestFragment(analyzer, "ngName", ngName);
				String townHighlighter = highlighter.getBestFragment(analyzer, "town", town);
				String pianQuHighlighter = highlighter.getBestFragment(analyzer, "pianQu", pianQu);
				String switchInTypeHighlighter = highlighter.getBestFragment(analyzer, "switchInType", switchInType);
				String addressTypeHighlighter = highlighter.getBestFragment(analyzer, "addressType", addressType);
				String flagHighlighter = highlighter.getBestFragment(analyzer, "flag", flag);
				String causesHighlighter = highlighter.getBestFragment(analyzer, "causes", causes);
				String crtTimeHighlighter = highlighter.getBestFragment(analyzer, "crtTime", crtTime);*/
				
				
				String idHighlighter = null;
				String ngNameHighlighter = null;
				String townHighlighter = null;
				String pianQuHighlighter = null;
				String switchInTypeHighlighter = null;
				String addressTypeHighlighter = null;
				String flagHighlighter = null;
				String causesHighlighter = null;
				String crtTimeHighlighter = null;
				if(StringUtils.isNotBlank(id)){
					 idHighlighter = highlighter.getBestFragment(analyzer, "id", id);
				}
				if(StringUtils.isNotBlank(ngName)){
					 ngNameHighlighter = highlighter.getBestFragment(analyzer, "ngName", ngName);
				}
				if(StringUtils.isNotBlank(pianQu)){
					 pianQuHighlighter = highlighter.getBestFragment(analyzer, "pianQu", pianQu);
				}
				if(StringUtils.isNotBlank(town)){
					townHighlighter = highlighter.getBestFragment(analyzer, "town", town);
				}
				
				if(StringUtils.isNotBlank(switchInType)){
					 switchInTypeHighlighter = highlighter.getBestFragment(analyzer, "switchInType", switchInType);
				}
				if(StringUtils.isNotBlank(addressType)){
					 addressTypeHighlighter = highlighter.getBestFragment(analyzer, "addressType", addressType);
				}
				if(StringUtils.isNotBlank(flag)){
					 flagHighlighter = highlighter.getBestFragment(analyzer, "flag", flag);
				}
				if(StringUtils.isNotBlank(causes)){
					 causesHighlighter = highlighter.getBestFragment(analyzer, "causes", causes);
				}
				if(StringUtils.isNotBlank(crtTime)){
					 crtTimeHighlighter = highlighter.getBestFragment(analyzer, "crtTime", crtTime);
				}
				
				
				
				if(idHighlighter == null){
					hh.setId(id);
				}else{
					hh.setId(idHighlighter);
				}
				if(ngNameHighlighter == null){
					hh.setNgName(ngName);
				}else{
					hh.setNgName(ngNameHighlighter);
				}
				if(townHighlighter == null){
					hh.setTown(town);
				}else{
					hh.setTown(townHighlighter);
				}
				if(pianQuHighlighter == null){
					hh.setPianQu(pianQu);
				}else{
					hh.setPianQu(pianQuHighlighter);
				}
				if(switchInTypeHighlighter == null){
					hh.setSwitchInType(switchInType);
				}else{
					hh.setSwitchInType(switchInTypeHighlighter);
				}
				if(addressTypeHighlighter == null){
					hh.setAddressType(addressType);
				}else{
					hh.setAddressType(addressTypeHighlighter);
				}
				if(flagHighlighter == null){
					if(flag!= null){
						hh.setFlag(Integer.parseInt(flag));
					}
				}else{
					hh.setFlag(Integer.parseInt(flagHighlighter));
				}
				if(causesHighlighter == null){
					hh.setCauses(causes);
				}else{
					hh.setCauses(causesHighlighter);
				}
				
				if (StringUtils.isNotBlank(crtTime)) {
					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
					Date parse = sdf.parse(crtTime);
					hh.setCrtTime(parse);
				}

				list.add(hh);
			}
			// 关闭索引查看器
			indexReader.close();
			long end = System.currentTimeMillis();
			System.out.println("结束时间:" + end);
			long time = end - start;
			System.out.println("用时:" + time + "毫秒");
			return list;
		} catch (InvalidTokenOffsetsException e) {
			e.printStackTrace();
		} catch (java.text.ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 获取指定分词器的分词结果
	 * 
	 * @param analyzeStr
	 *            要分词的字符串
	 * @param analyzer
	 *            分词器
	 * @return 分词结果
	 */
	public static List<String> getAnalyseResult(String analyzeStr, Analyzer analyzer) {
		List<String> response = new ArrayList<String>();
		TokenStream tokenStream = null;
		try {
			// 返回适用于fieldName的TokenStream,标记读者的内容。
			tokenStream = analyzer.tokenStream("name", new StringReader(analyzeStr));
			// 语汇单元对应的文本
			CharTermAttribute attr = tokenStream.addAttribute(CharTermAttribute.class);
			// 消费者在使用incrementToken()开始消费之前调用此方法。
			// 将此流重置为干净状态。 有状态的实现必须实现这种方法,以便它们可以被重用,就像它们被创建的一样。
			tokenStream.reset();
			// Consumers(即IndexWriter)使用此方法将流推送到下一个令牌。
			while (tokenStream.incrementToken()) {
				response.add(attr.toString());
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (tokenStream != null) {
				try {
					tokenStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return response;
	}
}

3 多字段搜索

import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLEncoder;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import com.rbc.hbms.estateView.entity.HbmsHouse;
import com.tds.framework.wsmanage.util.StringUtils;

/**
 * 多字段搜索
 * Created by MoSon on 2017/7/5.
 */
public class MultiFieldQuery {

	public static List<HbmsHouse> getInfo(String[] fields,String keyword, int number, Map<String, String> map) throws IOException, ParseException {
		try {
			long start = System.currentTimeMillis();
			System.out.println("开始时间:" + start);
			Directory directory = FSDirectory.open(new File("D:/EclipseWorkspace/zseboss/standardIndex"));
			// 定义索引查看器
			IndexReader indexReader = DirectoryReader.open(directory);
			// 定义搜索器
			IndexSearcher indexSearcher = new IndexSearcher(indexReader);

			//定义搜索
			BooleanQuery query = new BooleanQuery();
			
			StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_47);
//			String keyword = "229632874 江南街道";
//			String[] fields = new String[] { "ngName", "town", "pianQu" };
			BooleanClause.Occur[] flags = new BooleanClause.Occur[fields.length];
			/*for (int i = 0; i < fields.length; i++) {
				//如果是查询“未录入”就要必须有这个字段
				if(fields[i].equals("pianQu") || fields[i].equals("switchinType") 
						|| fields[i].equals("addressType") || fields[i].equals("flag")){
					for(Map.Entry<String, String> field : map.entrySet()){
						String key = field.getKey();
						if(key!=null){
							String value = field.getValue();
							Query query2 = new QueryParser(Version.LUCENE_47,key,analyzer).parse(value);
							query.add(query2, BooleanClause.Occur.MUST);
						}
					}
				}else{
					flags[i] = BooleanClause.Occur.SHOULD; 
				}
			}
			Query query1 = MultiFieldQueryParser.parse(Version.LUCENE_47, keyword, fields, flags, analyzer);
			query.add(query1, BooleanClause.Occur.SHOULD);
			*/
//			 Query query2 = new QueryParser(Version.LUCENE_47,"作者",analyzer).parse("辰东");
			// Query query2 = new
			// QueryParser(Version.LUCENE_47,"name",analyzer).parse("江门");

			
			
			for(Map.Entry<String, String> field : map.entrySet()){
				String key = field.getKey();
				if(key!=null){
					String value = field.getValue();
					Query query2 = new QueryParser(Version.LUCENE_47,key,analyzer).parse(value);
					query.add(query2, BooleanClause.Occur.MUST);
				}
			}
			
//			BooleanQuery query = new BooleanQuery();
		
			// query.add(query2, BooleanClause.Occur.SHOULD);

			
			/**定义高亮组件*/
			SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<span style='color:red;'>", "</span>");
			// 构建Scorer,用于选取最佳切片
			QueryScorer scorer = new QueryScorer(query);
			// 实例化Highlighter组件
			Highlighter highlighter = new Highlighter(formatter, scorer);
			// 构建Fragmenter对象,用于文档切片
			highlighter.setTextFragmenter(new SimpleFragmenter(100));
			highlighter.setEncoder(new SimpleHTMLEncoder());
			
			
			
			// 命中的前10条文档
			TopDocs topDocs = indexSearcher.search(query, 20);
			// 打印命中数
			System.out.println("命中数:" + topDocs.totalHits);

			// 取出文档
			ScoreDoc[] scoreDocs = topDocs.scoreDocs;

			List<HbmsHouse> list = new LinkedList<HbmsHouse>();
			for (ScoreDoc scoreDoc : scoreDocs) {
				HbmsHouse hh = new HbmsHouse();
				// 通过indexSearcher的doc方法取出文档
				Document doc = indexSearcher.doc(scoreDoc.doc);
				String id = doc.get("id");
				if (id == null) {
					continue;
				}
				String ngName = doc.get("ngName");
				String town = doc.get("town");
				String pianQu = doc.get("pianQu");
				String switchInType = doc.get("switchInType");
				String addressType = doc.get("addressType");
				String flag = doc.get("flag");
				String causes = doc.get("causes");
				String crtTime = doc.get("crtTime");
				
				
				String idHighlighter = null;
				String ngNameHighlighter = null;
				String townHighlighter = null;
				String pianQuHighlighter = null;
				String switchInTypeHighlighter = null;
				String addressTypeHighlighter = null;
				String flagHighlighter = null;
				String causesHighlighter = null;
				String crtTimeHighlighter = null;
				// 高亮
				if (StringUtils.isNotBlank(id)) {
					idHighlighter = highlighter.getBestFragment(analyzer, "id", id);
				}
				if (StringUtils.isNotBlank(ngName)) {
					ngNameHighlighter = highlighter.getBestFragment(analyzer, "ngName", ngName);
				}
							/*		  if(StringUtils.isNotBlank(pianQu)){
					 pianQuHighlighter = highlighter.getBestFragment(analyzer, "pianQu", pianQu);
				}
				if(StringUtils.isNotBlank(town)){
					townHighlighter = highlighter.getBestFragment(analyzer, "town", town);
				}
				
				if(StringUtils.isNotBlank(switchInType)){
					 switchInTypeHighlighter = highlighter.getBestFragment(analyzer, "switchInType", switchInType);
				}
				if(StringUtils.isNotBlank(addressType)){
					 addressTypeHighlighter = highlighter.getBestFragment(analyzer, "addressType", addressType);
				}
				if(StringUtils.isNotBlank(flag)){
					 flagHighlighter = highlighter.getBestFragment(analyzer, "flag", flag);
				}
				if(StringUtils.isNotBlank(causes)){
					 causesHighlighter = highlighter.getBestFragment(analyzer, "causes", causes);
				}
				if(StringUtils.isNotBlank(crtTime)){
					 crtTimeHighlighter = highlighter.getBestFragment(analyzer, "crtTime", crtTime);
				}*/
				
				if(idHighlighter == null){
					hh.setId(id);
				}else{
					hh.setId(idHighlighter);
				}
				String ngNameValue = map.get("ngName");
				if(ngNameHighlighter == null || ngNameValue == null){
					hh.setNgName(ngName);
				}else{
					hh.setNgName(ngNameHighlighter);
				}
				if(townHighlighter == null){
					hh.setTown(town);
				}else{
					//因为是代码,不能用作高亮
					hh.setTown(townHighlighter);
				}
				if(pianQuHighlighter == null){
					hh.setPianQu(pianQu);
				}else{
					hh.setPianQu(pianQuHighlighter);
				}
				if(switchInTypeHighlighter == null){
					hh.setSwitchInType(switchInType);
				}else{
					hh.setSwitchInType(switchInTypeHighlighter);
				}
				if(addressTypeHighlighter == null){
					hh.setAddressType(addressType);
				}else{
					hh.setAddressType(addressTypeHighlighter);
				}
				if(flagHighlighter == null){
					if(flag!= null){
						hh.setFlag(Integer.parseInt(flag));
					}
				}else{
					hh.setFlag(Integer.parseInt(flagHighlighter));
				}
				if(causesHighlighter == null){
					hh.setCauses(causes);
				}else{
					hh.setCauses(causesHighlighter);
				}
				
				if (StringUtils.isNotBlank(crtTime)) {
					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
					Date parse = sdf.parse(crtTime);
					hh.setCrtTime(parse);
				}
				//添加到集合
				list.add(hh);
			}

			// 关闭索引查看器
			indexReader.close();

			long end = System.currentTimeMillis();
			System.out.println("开始时间:" + end);
			long time = end - start;
			System.out.println("用时:" + time + "毫秒");

			return list;
		} catch (java.text.ParseException e) {
			e.printStackTrace();
		} catch (InvalidTokenOffsetsException e) {
			e.printStackTrace();
		}
		return null;
	}

想看入门可以看底部的“我的更多文章”。


猜你喜欢

转载自blog.csdn.net/starjuly/article/details/77718983