Lucene进阶操作,单字段、多字段和布尔搜索
2017-08-30 17:05
501 查看
上一篇文章是入门,现在是进阶,通过项目用到的例子给大家呈现较好的方法。本方法基于Lucene-4.7.2因为项目要用到JDK1.6。
这里使用几个很好用的类,是经过多次试验整理出来的,分别是单字段搜索,多字段搜索以及布尔搜索。
1 单字段搜索
2 布尔搜索
3 多字段搜索
想看入门可以看底部的“我的更多文章”。
这里使用几个很好用的类,是经过多次试验整理出来的,分别是单字段搜索,多字段搜索以及布尔搜索。
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; }
想看入门可以看底部的“我的更多文章”。
相关文章推荐
- lucene的多个字段搜索以及分页并高亮显示
- Lucene多字段搜索
- Lucene.net多字段(Fields)、多索引目录(IndexSearcher)搜索
- lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3
- Lucene多字段搜索
- 【Lucene4.8教程之一】使用Lucene4.8进行索引及搜索的基本操作
- 【Mysql】JDBC对数据库布尔字段的操作
- Lucene多字段搜索
- 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词
- lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3
- Lucene.net多字段多索引目录搜索
- Lucene.net多字段 - 多索引目录搜索【转】
- 艾伟_转载:Lucene.net多字段多索引目录搜索
- 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词
- Lucene.net多字段(Fields)、多索引目录(IndexSearcher)搜索
- 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词
- 【Lucene4.8教程之一】使用Lucene4.8进行索引及搜索的基本操作 2014-06-11 10:47 3130人阅读 评论(1) 收藏
- lucene-对每个字段指定分析器及较复杂搜索页面(对QQ国内新闻搜索)
- lucene6 搜索按照字符串字段排序
- 【Lucene4.8教程之一】使用Lucene4.8进行索引及搜索的基本操作