lucene实现 某段时间内 多个存储字段 多关键字的查询 并且加入排序规则 思路...

由于博客内容为空,无法提供包含关键信息的摘要。
1535273.aspx
package com.boe.cim.teacher.luence; import java.io.StringReader; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; 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.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.search.WildcardQuery; import org.apache.lucene.search.highlight.Fragmenter; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleHTMLFormatter; import org.apache.lucene.search.highlight.SimpleSpanFragmenter; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import com.boe.cim.teacher.pojo.RequirementInfo; public class LuceneSearchRequirement { /** * @param indexreDir * 索引文件路径path * @param queryField * 被索引字段 Field * @param queryMsg * 索引值 * @return * @throws Exception */ public List<RequirementInfo> search(String indexreDir, String queryField, String queryMsg) throws Exception { // 得到读取索引文件的路径 Directory dir = FSDirectory.open(Paths.get(indexreDir)); // 通过dir得到的路径下的所有的文件 // 建立索引查询器 IndexReader reader = DirectoryReader.open(dir); IndexSearcher searcher = new IndexSearcher(reader); // 中文分词器 SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer(); // 建立查询解析器 /** * 第一个参数是要查询字段; 第二个参数是分析器Analyzer */ // QueryParser parser = new QueryParser(queryField, analyzer); // 根据传进来的par查找 // Query query = parser.parse(queryMsg); // Query query = new TermQuery(new Term("teacher",queryMsg)); // Query query = new WildcardQuery(new Term(queryField,"*"+queryMsg+"*")); Query query; //这四种类型需要特别匹配,不需要分词器进行搜索 if(queryField.equals("requirement") || queryField.equals("department") || queryField.equals("liaisonman") || queryField.equals("requirementtype") ) { query = new WildcardQuery(new Term(queryField,"*"+queryMsg+"*")); }else { QueryParser parser = new QueryParser(queryField, analyzer); query = parser.parse(queryMsg); } // 计算索引开始时间 long start = System.currentTimeMillis(); // 开始查询 /** * 第一个参数是通过传过来的参数来查找得到的query; 第二个参数是要出查询的行数 */ TopDocs topDocs = searcher.search(query, 104); // 索引结束时间 long end = System.currentTimeMillis(); System.out.println("匹配:["+queryField+"]," + queryMsg + ",总共花费了" + (end - start) + "毫秒,共查到" + topDocs.totalHits + "条记录。"); // 高亮显示start // 算分 QueryScorer scorer = new QueryScorer(query); // 显示得分高的片段 Fragmenter fragmenter = new SimpleSpanFragmenter(scorer); // 设置标签内部关键字的颜色 // 第一个参数:标签的前半部分;第二个参数:标签的后半部分。 SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<b><font color='red'>", "</font></b>"); // 第一个参数是对查到的结果进行实例化;第二个是片段得分(显示得分高的片段,即摘要) Highlighter highlighter = new Highlighter(simpleHTMLFormatter, scorer); // 设置片段 highlighter.setTextFragmenter(fragmenter); // 高亮显示end // 遍历topDocs /** * ScoreDoc:是代表一个结果的相关度得分与文档编号等信息的对象。 scoreDocs:代表文件的数组 * * @throws Exception */ List<RequirementInfo> listinfo = new ArrayList<>(); for (ScoreDoc scoreDoc : topDocs.scoreDocs) { RequirementInfo requirementinfo = new RequirementInfo(); // 获取文档 Document document = searcher.doc(scoreDoc.doc); // 输出全路径 String id = document.get("id"); String queryType = document.get(queryField); requirementinfo.setId(Integer.parseInt(id)); if (id != null) { // 把全部得分高的摘要给显示出来 // 第一个参数是对哪个参数进行设置;第二个是以流的方式读入 TokenStream tokenStream = analyzer.tokenStream(queryField, new StringReader(queryType)); // 获取最高的片段 String highlighterString; if(queryField.equals("requirement") || queryField.equals("department") || queryField.equals("liaisonman") || queryField.equals("requirementtype") ) { highlighterString = queryType.replaceAll(queryMsg, "<b><font color='red'>"+queryMsg+"</font></b>"); }else { highlighterString = highlighter.getBestFragment(tokenStream, queryType); } // String highlighterString = highlighter.getBestFragment(new SmartChineseAnalyzer(), queryField, queryType); //设置高亮字段 switch (queryField) { // 根据搜索条件进行赋值 case "requirement": //需求名称 requirementinfo.setRequirement(highlighterString); break; case "department": //需求组织 requirementinfo.setDepartment(highlighterString); break; case "liaisonman": //需求联系人 requirementinfo.setLiaisonman(highlighterString); break; case "requirementtype": //需求类型 requirementinfo.setRequirementtype(Integer.parseInt(highlighterString)); break; case "requirementcontents": //需求内容 requirementinfo.setRequirementcontents(highlighterString); break; case "requirementbackground": //需求背景 requirementinfo.setRequirementbackground(highlighterString); break; } listinfo.add(requirementinfo); } } reader.close(); return listinfo; } } 报错匹配:[requirementtype],1,总共花费了18毫秒,共查到10条记录。 java.lang.NumberFormatException: For input string: "<b><font color='red'>1</font></b>" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.parseInt(Integer.java:615) at com.boe.cim.teacher.luence.LuceneSearchRequirement.search(LuceneSearchRequirement.java:131) at com.boe.cim.teacher.controller.RequirementInfoSelectFunctionController.simpleselect(RequirementInfoSelectFunctionController.java:38) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
最新发布
09-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值