- 浏览: 182070 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (134)
- java笔记 (25)
- Android开发 (3)
- Mybatis笔记 (1)
- oracle (9)
- javaScript (23)
- struts2 (2)
- jquery (6)
- java多线程 (6)
- 全文检索lucene (1)
- solr4.4 (5)
- solr4.9 (1)
- css 要点 (2)
- fmt格式化 (1)
- 百度地图 (1)
- 显示层jsp (2)
- ant (3)
- 脑袋放水 (2)
- 播放器 (1)
- log日志 (1)
- Spring (1)
- 设计模式 (2)
- httpservlet (1)
- seo (1)
- eclipse使用技巧 (1)
- 正则表达式 (2)
- 我的异常解决方案 (2)
- 集群服务器 (2)
- java网络编程 (3)
- Eclipse快捷键 (1)
- 图片和Base64互转 (1)
- maven (0)
- jsoup 网络爬虫 (1)
- 安全防范 (1)
- 非关系型数据库 (1)
- 在线工具 (1)
- HTML5学习 (1)
- Apache-Mina (1)
最新评论
-
wenjiao8204322:
不好意思说错了,是变量替换后,如果是英文和数字,是不换行的,如 ...
html 转换成pdf -
wenjiao8204322:
楼主你好,有问题、一直难以解决,我们项目上线后,就遗留在这就是 ...
html 转换成pdf -
jacking124:
scoreName 这个属性是做什么的!
jquery.raty-评级插件 -
高军威:
yixiandave 写道高军威 写道alvin198761 ...
Java中的五种实现方法【单例模式】 -
yixiandave:
高军威 写道alvin198761 写道53./** 54. ...
Java中的五种实现方法【单例模式】
添加删除索引方法:
实现添加索引
查询索引
lucene的一般查询方法
/** * 优化索引,返回优化策略 * * @return */ private static LogMergePolicy optimizeIndex() { LogMergePolicy mergePolicy = new LogByteSizeMergePolicy(); // 设置segment添加文档(Document)时的合并频率 // 值较小,建立索引的速度就较慢 // 值较大,建立索引的速度就较快,>10适合批量建立索引 // 达到50个文件时就和合并 mergePolicy.setMergeFactor(50); // 设置segment最大合并文档(Document)数 // 值较小有利于追加索引的速度 // 值较大,适合批量建立索引和更快的搜索 mergePolicy.setMaxMergeDocs(5000); // 启用复合式索引文件格式,合并多个segment mergePolicy.setUseCompoundFile(true); return mergePolicy; } private void Index() { Directory directory = null; File indexDir = new File(index_path); try { directory = FSDirectory.open(indexDir); IKAnalyzer analyzer = new IKAnalyzer(); IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_40, analyzer); indexWriterConfig.setMergePolicy(optimizeIndex()); indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND); IndexWriter writer = new IndexWriter(directory, indexWriterConfig); // 查询索引 SWResultList indexList = new SWResultList(0, 1); SWInfoFactory.getInfo().listIndex(" order by idx_id", " and cz_status in ('0') ", indexList); int delCount = 0; int createCount = 0; for (Object idx : indexList.getMydata()) { // 类型转换 Map<?, ?> idxMap = (Map<?, ?>) idx; if (idxMap.get("cz_flag").toString().equals("1")) { // 增加索引 Document document = InfoDocument.document("", idxMap.get("cz_id").toString()); if (document == null) { setStatus("9", idxMap.get("idx_id").toString()); logger.error("要创建索引的信息不存在,info_code=" + idxMap.get("cz_id").toString()); } else { try { setStatus("1", idxMap.get("idx_id").toString()); writer.addDocument(document); setStatus("8", idxMap.get("idx_id").toString()); createCount++; } catch (Exception e) { setStatus("9", idxMap.get("idx_id").toString()); } } } else { // 删除索引 Term term = new Term("Infocode", idxMap.get("cz_id").toString()); try { setStatus("1", idxMap.get("idx_id").toString()); writer.deleteDocuments(term); setStatus("8", idxMap.get("idx_id").toString()); delCount++; } catch (Exception e) { setStatus("9", idxMap.get("idx_id").toString()); } } } logger.info("新增索引 " + createCount + " 条!"); logger.info("删除索引 " + delCount + " 条!"); writer.close(); } catch (IOException e) { e.printStackTrace(); } } private void setStatus(String status, String idxid) { this.dao.update("update cec_idx set cz_status=" + status + " where idx_id='" + idxid + "'"); } public boolean isRun() { return run; }
实现添加索引
/** * <ul> * <li>项目名称: ***</li> * <li>功能描述: 将信息封装到索引</li> *</ul> * @author Administrator * @version $Id: InfoDocument.java, 2013-7-22 下午4:52:01 Administrator Exp $ */ public class InfoDocument { public static Document document(String cz_table, String cz_id) { //查出要建索引的数据封装到map中 Map info = SWInfoFactory.getInfo().getInfo(cz_table, cz_id); if (info == null) { return null; } Document doc = new Document(); FieldType ft = new FieldType(); ft.setStored(true); // 设置是否进行存储 ft.setIndexed(true); // 设置是否能够索引到 ft.setTokenized(true);// 设置是否进行分词分析 FieldType ft2 = new FieldType(); ft2.setStored(true); // 设置是否进行存储 ft2.setIndexed(true); // 设置是否能够索引到 ft2.setTokenized(false);// 设置是否进行分词分析 Field ci_id = new Field("ci_id", info.get("ci_id") == null?"": info.get("ci_id").toString(), ft2); Field ci_title = new Field("ci_title", info.get("ci_title") == null?"": info.get("ci_title").toString(), ft); Field ci_title2 = new Field("ci_title2", info.get("ci_title2") == null?"": info.get("ci_title2").toString(), ft); Field ci_ctime = new Field("ci_ctime", info.get("ci_ctime") == null?"": info.get("ci_ctime").toString(), ft2); Field ci_keys = new Field("ci_keys", info.get("ci_keys") == null?"": info.get("ci_keys").toString(), ft); Field ci_content = new Field("ci_content", info.get("ci_content") == null?"": info.get("ci_content").toString(), ft); Field cf_title = new Field("cf_title", info.get("cf_title") == null?"": info.get("cf_title").toString(), ft); Field s_cc_id = new Field("s_cc_id", info.get("s_cc_id") == null?"": info.get("s_cc_id").toString(), ft2); Field s_cc_name = new Field("s_cc_name", info.get("s_cc_name") == null?"": info.get("s_cc_name").toString(), ft); Field cc_supid = new Field("cc_supid", info.get("cc_supid") == null?"": info.get("cc_supid").toString(), ft2); Field f_cc_id = new Field("f_cc_id", info.get("f_cc_id") == null?"": info.get("f_cc_id").toString(), ft2); Field f_cc_name = new Field("f_cc_name", info.get("f_cc_name") == null?"": info.get("f_cc_name").toString(), ft); doc.add(ci_id); doc.add(ci_title); doc.add(ci_title2); doc.add(ci_ctime); doc.add(ci_keys); doc.add(ci_content); doc.add(cf_title); doc.add(s_cc_id); doc.add(s_cc_name); doc.add(cc_supid); doc.add(f_cc_id); doc.add(f_cc_name); return doc; } }
查询索引
public class SearchInfoutile { private static String path = ConfigManager.getInstance().getConfigItem("cms.infoindex.path", "./eqinfoindex").toString(); public static Map getInfoContent(String sareacode, int page) { Map map = new HashMap(); map.put("resultlist", null); map.put("totalpage", 0);// 总页数 map.put("totalpagenum", 0);// 总条数 int searchRows = 7;// 每页显示的数据条数 int totalpage = 0; int iStartRow = (page - 1) * searchRows; int iEndRow = page * searchRows; List list = new ArrayList(); Directory directory = null; IndexSearcher isearcher = null; String[] searchFields = { "ci_title", "ci_title2", "ci_keys", "ci_content", "cf_title","s_cc_name","f_cc_name"}; try { TopScoreDocCollector collector = TopScoreDocCollector.create(searchRows * page, false); Date start = new Date(); File indexDir = new File(path); directory = FSDirectory.open(indexDir); IKAnalyzer analyzer = new IKAnalyzer(); IndexReader indexReader = DirectoryReader.open(directory); isearcher = new IndexSearcher(indexReader); BooleanQuery booleanQuery = new BooleanQuery(); // 检索的关键词 if (sareacode != null && !"".equals(sareacode)) { QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_40, searchFields, analyzer); Query q1 = parser.parse(sareacode); booleanQuery.add(q1, BooleanClause.Occur.MUST); }else { Date date = new Date(); SimpleDateFormat time=new SimpleDateFormat("yyyyMMddHHmmss"); String times = time.format(date); BytesRef lowerTerm = new BytesRef("19000101010100"); BytesRef upperTerm = new BytesRef(times); TermRangeQuery query = new TermRangeQuery("ci_ctime", lowerTerm, upperTerm, true, true); booleanQuery.add(query, BooleanClause.Occur.MUST); } isearcher.search(booleanQuery, collector); int numTotalHits = collector.getTotalHits(); iStartRow = Math.min(numTotalHits, iStartRow); iEndRow = Math.min(numTotalHits, iEndRow); TopDocs topDocs = collector.topDocs(iStartRow, iEndRow - iStartRow); ScoreDoc[] scoreDocs = topDocs.scoreDocs; list = toList(isearcher, scoreDocs); if (numTotalHits % searchRows == 0) { totalpage = numTotalHits / searchRows; } else { totalpage = numTotalHits / searchRows + 1; } map.put("resultlist", list); map.put("totalpage", totalpage);// 总页数 map.put("totalpagenum", numTotalHits);// 总条数 return map; } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } return map; } // 索引集合转换成list集合 public static List toList(IndexSearcher isearcher, ScoreDoc[] scoreDocs) { List list = new ArrayList(); for (int i = 0; i < scoreDocs.length; i++) { Map map = new HashMap(); try { Document targetDoc = isearcher.doc(scoreDocs[i].doc); map.put("ci_id", targetDoc.get("ci_id")); map.put("ci_title", targetDoc.get("ci_title")); map.put("ci_title2", targetDoc.get("ci_title2")); map.put("ci_ctime", targetDoc.get("ci_ctime")); map.put("ci_keys", targetDoc.get("ci_keys")); map.put("ci_content", targetDoc.get("ci_content")); map.put("s_cc_id", targetDoc.get("s_cc_id")); map.put("s_cc_name", targetDoc.get("s_cc_name")); map.put("s_cc_name", targetDoc.get("s_cc_name")); map.put("cc_supid", targetDoc.get("cc_supid")); map.put("f_cc_id", targetDoc.get("f_cc_id")); map.put("f_cc_name", targetDoc.get("f_cc_name")); list.add(map); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return list; } public static String torealtime(Date date, int a) { Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.DATE, a); String starttime = (new SimpleDateFormat("yyyyMMdd")).format(cal.getTime()) + "000000"; return starttime; } }
lucene的一般查询方法
/** * 查询方法 * @throws IOException * @throws CorruptIndexException * @throws ParseException * @throws InvalidTokenOffsetsException */ public List Search(String searchString,LuceneResultCollector luceneResultCollector) throws CorruptIndexException, IOException, ParseException, InvalidTokenOffsetsException{ //方法一: //String[] fields = {"fileName","fieldid","date"}; //MultiFieldQueryParser 用来查询多个字段 queryparser //QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_40 ,fields, this.indexSettings.getAnalyzer()); //Query query = parser.parse(searchString); //词条查询 方法二: //Term t = new Term("fileName", searchString); //Query query = new TermQuery(t); //String[] searchFields = {"Infotitle","Linkaddr","Skuname","Skudetaile"}; //布尔类型查询(BooleanQuery) //BooleanQuery query = new BooleanQuery(); BooleanQuery query = new BooleanQuery(); //检索的关键词 /*QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_40 ,searchFields,this.indexSettings.getAnalyzer()); Query q1 = parser.parse("苹果"); query.add(q1,BooleanClause.Occur.MUST);*/ //哪个模块下下的 Term t2 = new Term("fileName","java宝典"); Query q2 = new TermQuery(t2); query.add(q2,BooleanClause.Occur.SHOULD); Term t2s = new Term("fileName","java神器"); Query q2s = new TermQuery(t2s); query.add(q2s,BooleanClause.Occur.SHOULD); //供求类型 /*Term t3 = new Term("Infotype","2"); Query q3 = new TermQuery(t3); query.add(q3,BooleanClause.Occur.MUST);*/ /* //地区编号 Term t4 = new Term("Areacode",""); PrefixQuery q4 = new PrefixQuery(t4); query.add(q4,BooleanClause.Occur.MUST); //产品种类 Term t5 = new Term("Infocateg",""); PrefixQuery q5 = new PrefixQuery(t5); query.add(q5,BooleanClause.Occur.MUST);*/ /* Term t1 = new Term("fileName", "*"); TermQuery q1 = new TermQuery(t1); Term t2 = new Term("date", ""); PrefixQuery q2 = new PrefixQuery(t2);*/ // Term t3 = new Term("fileName", "java"); //PrefixQuery q3 = new PrefixQuery(t3); //query.add(q1,BooleanClause.Occur.MUST); //query.add(q3,BooleanClause.Occur.MUST); //query.add(q2,BooleanClause.Occur.MUST); //范围搜索(TermRangeQuery) ------------------------ //当查询范围较大且满足条件的文档数量也很大时效率是很低的 //Date date = new Date(); //SimpleDateFormat time=new SimpleDateFormat("yyyyMMddHHmmss"); //String times = time.format(date); //范围搜索(TermRangeQuery) //当查询范围较大且满足条件的文档数量也很大时效率是很低的 //BytesRef lowerTerm = new BytesRef("19000101010100"); //BytesRef upperTerm = new BytesRef(times); //System.out.println("19000101010100"); //System.out.println(times); //TermRangeQuery query = new TermRangeQuery("Pubtime", lowerTerm, upperTerm, true, true); //模糊查询 //另外两个构造函数 //FuzzyQuery fd = new FuzzyQuery(term, maxEdits) //maxEdits 最大相似度,默认为0.5(待议 3.0版的) //prefixLength 表示进行模糊匹配的时候,要有多少个前缀字母必须完全匹配 //如果是1,表示所有词条只有第一个字母与检索关键字相符时,才会被放入备选集合中 //FuzzyQuery fd = new FuzzyQuery(t,int 1,int prefixLength) //FuzzyQuery fuzzyQuery = new FuzzyQuery(new Term("fileName", "java"), 0); // 数字越小越精确0-2 //前缀查询 最前面的几个字 //PrefixQuery query2 = new PrefixQuery(term); //短语查询 先拆分成单字 核心方法 使用 布尔类型查询(BooleanQuery)来装载子句 //子句间关系设为 MUST取其交集 //setSlop(int) 设置坡度,默认值为0,给出严格匹配短语的文档作为结果, //设置为setSlop(1),表示中间可以插入无关字数的个数 1代表中间可以插入无关字个数为1个 //PhraseQuery query2 = new PhraseQuery(); //query2.add(term); //query2.setSlop(1); //多短语查询(自我感觉鸡肋,也许有一天我会用到他的) //MultiPhraseQuery query2 = new MultiPhraseQuery(); //通配符搜索 //Term term = new Term("filed","?o*"); //WildcardQuery query2 = new WildcardQuery(term); //跨度搜索 //SpanTermQuery query2 = new SpanTermQuery(term); //Sort sort = new Sort(); //SortField sortField = new SortField("fileid",FieldCache.DEFAULT_INT_PARSER, false); //sort.setSort(sortField); //ScoreDoc[] docs = this.indexSearcher.search(query,100,sort).scoreDocs; ScoreDoc[] docs = this.indexSearcher.search(query,100).scoreDocs; System.out.println("一共有:"+docs.length+"条记录"); List result = luceneResultCollector.collect(docs, this.indexSearcher, query ,this.indexSearcher,this.indexSettings.getAnalyzer()); return result; }
相关推荐
《Lucene4.0实例详解》 Lucene是一款强大的全文搜索引擎库,被广泛应用于各种信息检索系统中。这里我们主要探讨的是Lucene 4.0版本的实例应用,旨在通过实际操作来理解其核心概念和功能。 一、Lucene基础 Lucene ...
《Lucene 4.0:构建搜索引擎的基本操作详解》 Lucene 4.0是一款强大的全文搜索引擎库,...继续深入学习,可以掌握更复杂的查询构造、近实时搜索、多字段排序等高级特性,从而在实际项目中充分利用Lucene的强大功能。
通过学习这个项目,开发者可以快速了解 Lucene 4.0 的基本操作,并将其应用到自己的搜索应用中。 总之,Lucene 4.0 提供了强大的文本索引和搜索功能,让开发者能够轻松地在应用程序中集成高级搜索功能。这个简单的...
"IK Analyzer 2012FF_hf1_IK分词lucene4.0_源码" 提供的是IK分词器的一个特定版本,适用于Lucene 4.0,这在当时是一个相对老但仍然被一些项目依赖的版本。 分词是中文信息处理的关键步骤,它将连续的汉字序列分割成...
本文将深入探讨如何利用Lucene 4.0版本和IK中文分词器搭建一个基础的全文搜索示例,并进行简单学习。 首先,让我们了解Lucene 4.0。这是一个开源的全文检索库,由Apache软件基金会开发。它提供了索引和搜索的底层...
**Lucene 索引图形化界面工具 LukeAll 3.5~4.0** Lucene 是一个开源的全文搜索引擎库,它提供了强大的文本搜索功能,但其本身的接口设计是命令行或者编程式的,对于非开发人员或者在调试索引时可能会显得不太友好。...
这一版本的Lucene包含了多项改进和优化,是开发者研究和学习的重要参考。 一、Lucene的基本架构 Lucene的核心组件包括索引(Index)、查询解析器(Query Parser)、搜索(Search)和文档处理(Document)。源码中,...
在"luceneDemo4.0"中,你将会看到以上概念的具体应用,包括创建索引、执行查询、高亮展示结果以及调整排序逻辑的示例代码。通过实践这个项目,你不仅可以了解Lucene的基本操作,还能学习到如何在实际项目中优化搜索...
《盘古分词与Lucene 3.0.3在.NET 4.0中的应用实践》 盘古分词和Lucene是两个在中文信息处理领域广泛应用的工具,本示例将详细介绍如何在.NET 4.0环境中整合这两个组件,以实现高效的全文搜索功能,并新增了分页功能...
Lucene4.0-lisj可能是Lucene的4.0版本的一个学习资源或者示例代码集合。 在Java搜索引擎技术中,有几个关键知识点: 1. **文本分析(Text Analysis)**:这是搜索引擎处理输入文档的第一步,包括分词...
- **学习版本**:Lucene 4.0(由于lukeall-4.0.0-ALPHA.jar并非最新版本,因此选择该版本进行学习) ### 全文检索简介 全文检索是指根据检索条件,在所有文档中进行精确或模糊匹配的过程。这种检索方式特别适用于...
6. **LUCENE4.0搜索引擎**: 在项目中,他用LUCENE4.0实现商品搜索功能,LUCENE是一个全文检索库,用于快速建立高效的全文检索功能,这表明他对搜索引擎技术和开源工具的熟练应用。 7. **教育背景**: 拥有计算机科学...
ASP.NET 4.0网上书店源码是一款基于微软.NET Framework ...通过研究这个ASP.NET 4.0网上书店源码,开发者不仅可以学习到Web开发的基本技能,还能深入了解电子商务应用的实现细节,提高自己的项目管理和代码组织能力。
IKAnalyzer2012FF.jar是一款专为中文处理而设计的分词工具,它在Lucene 4.0和Solr 4.0的基础上进行了优化和扩展,为中文信息检索提供强大的支持。这个jar包的核心功能是中文分词,它能够有效地将连续的汉字序列分割...
Solr 4.0 是Apache Lucene项目的一个子项目,是一个高性能、全文本搜索服务器,为企业级数据提供强大的搜索功能。源代码实例是学习Solr内部工作原理和自定义功能的关键资源,尤其对于开发者而言,深入理解源码有助于...
- 文件名`hibernate-search-4.4.0.Final`表明包含的是Hibernate Search模块,这是一个集成全文搜索引擎(如Lucene)的插件,允许开发者实现复杂的全文搜索功能,例如模糊匹配、关键词高亮等。 6. **兼容性与互操作...
- 五百丁商城的后台系统开发项目中,候选人负责了项目框架的搭建、商品搜索功能(使用LUCENE4.0实现)以及团队协调,这展示了他在项目管理和搜索引擎技术上的专长。他还从中学习到了团队管理与任务分配的重要性。 ...
- 在小七仔商城后台系统开发项目中,工程师担任了关键角色,包括设定项目功能目标、构建项目框架,并利用LUCENE 4.0实现了商品搜索功能。此外,他还负责团队任务分配和成果验收,这反映出良好的项目管理和团队协作...
- **高级主题**:深入学习搜索引擎Lucene、工作流JBPM、WebService、单点登录等高级主题。 - **新兴技术**:学习Hadoop等大数据处理技术,为将来从事云计算相关工作打下基础。 #### 3. 实践与项目经验 无论选择哪...