1.先定义一个baseCollertor
public abstract class BaseCollector extends TopDocsCollector<BaseScoreDoc> { BaseScoreDoc pqTop; int docBase = 0; Scorer scorer; private Comparable cpb = Comparable.DFAULT_COMPARABLE; protected BaseCollector(int numHits,Comparable cpb) { super(new HitQueue(numHits, true,cpb)); if(cpb != null){ this.cpb = cpb; } pqTop = pq.top(); } protected BaseCollector(int numHits) { super(new HitQueue(numHits, true)); pqTop = pq.top(); } /** * 关键代码,别乱改 */ public void collect(int doc) throws IOException { // This collector cannot handle these scores: float score = scorer.score() ; assert score != Float.NEGATIVE_INFINITY; assert !Float.isNaN(score); BaseScoreDoc csb = new BaseScoreDoc(doc,score); csb.doc = doc; csb.score = score; process(csb); if(csb.f < 0){ return ; } totalHits++; if(cpb.lessThan(csb, pqTop)){ return; } pqTop.f = csb.f; pqTop.sortValue = csb.sortValue; pqTop.doc = doc + docBase; pqTop.score = score; pqTop = pq.updateTop(); } public abstract void process(BaseScoreDoc csb); @Override protected TopDocs newTopDocs(ScoreDoc[] results, int start) { if (results == null) { return EMPTY_TOPDOCS; } float maxScore = Float.NaN; if (start == 0) { maxScore = results[0].score; } else { for (int i = pq.size(); i > 1; i--) { pq.pop(); } maxScore = pq.pop().score; } return new TopDocs(totalHits, results, maxScore); } @Override public void setNextReader(IndexReader reader, int base) { docBase = base; } @Override public void setScorer(Scorer scorer) throws IOException { this.scorer = scorer; } @Override public boolean acceptsDocsOutOfOrder() { return false; }
2.写自己的collertor,有两个分类,一个是单位名称分类,一个是地区分类
public class AnimalManagementCollector extends BaseCollector { private Map<String, Integer> unitMap = new HashMap<String, Integer>();//单位名称 private Map<String, Integer> zoneMap = new HashMap<String, Integer>();//地区 public AnimalManagementCollector(int numHits) { super(numHits, Comparable.DESC_COMPARABLE); } @Override public void process(BaseScoreDoc csb) { int doc = csb.doc; String unit_cache = InstrumentFields.UNIT_CACHE[doc]; String zone_cache = InstrumentFields.ZONE_CACHE[doc]; if (!(StringUtil.isEmpty(unit_cache))) { if (unitMap.containsKey(unit_cache)) { unitMap.put(unit_cache, unitMap.get(unit_cache) + 1); } else { unitMap.put(unit_cache, 1); } } if (!(StringUtil.isEmpty(zone_cache))) { if (zoneMap.containsKey(zone_cache)) { zoneMap.put(zone_cache, zoneMap.get(zone_cache) + 1); } else { zoneMap.put(zone_cache, 1); } } } public Map<String, Integer> getUnitMap() { return unitMap; } public void setUnitMap(Map<String, Integer> unitMap) { this.unitMap = unitMap; } public Map<String, Integer> getZoneMap() { return zoneMap; } public void setZoneMap(Map<String, Integer> zoneMap) { this.zoneMap = zoneMap; }
3.定制field
public class AnimalManagementFields { public static String[] UNIT_CACHE; //单位名称 public static String[] ZONE_CACHE; //地区 public synchronized void init(IndexReader ir) { readCache(ir); } public static void readCache(IndexReader ir) { int maxDoc = ir.maxDoc(); final String[] tempUnit = new String[maxDoc + 1]; final String[] tempZone = new String[maxDoc + 1]; FieldExtractor.extract(ir, "unit1", new FieldExtractor.FieldWalker() { @Override public void stroll(int doc, String value) { try { tempUnit[doc] = value; } catch (Exception e) { } } }); FieldExtractor.extract(ir, "zone", new FieldExtractor.FieldWalker() { @Override public void stroll(int doc, String value) { try { tempZone[doc] = value; } catch (Exception e) { } } }); UNIT_CACHE = tempUnit; ZONE_CACHE = tempZone; } }
4.在web.xml设置初始化
<servlet> <servlet-name>Init</servlet-name> <servlet-class>com.dayainfo.action.InitServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
5.在InitServlet中初始化
public class InitServlet extends HttpServlet { private static final long serialVersionUID = 1L; private Logger logger = Logger.getLogger(InitServlet.class); public void init(ServletConfig config) throws ServletException { try { long beginTime1 = System.currentTimeMillis(); AnimalManagementFields animalManagementFields = new AnimalManagementFields(); animalManagementFields.init(SQLCreatReader.getReader(SystemConstant.ANIMAL_MANAGEMENT_LICENCE_INDEX_KEY)); long endTime1 = System.currentTimeMillis(); logger.info("初始化_动物管理许可证_聚类信息耗时:" + StringUtil.millsecondChange(endTime1 - beginTime1, 1) + "秒"); } catch (IOException e) { e.printStackTrace(); } }
6.在搜索中使用
public class AnimalManagementSearchService { private AnimalManagementReturnParam animalManagementReturnParam = new AnimalManagementReturnParam(); private int totalData; private ScoreDoc[] scoreDocs; public void handleInstrumentSearch(AnimalManagementReceiveParam animalManagementReceiveParam) throws IOException { long beginTime = System.currentTimeMillis(); int numHits = animalManagementReceiveParam.getPageSize() * (animalManagementReceiveParam.getCurrentPage()); AnimalManagementCollector animalManagementCollector = new AnimalManagementCollector(numHits); List<AnimalManagementLicenceBean> instrumentBeanListWithPage = luceneSearch(animalManagementCollector, animalManagementReceiveParam); animalManagementReturnParam.setAnimalManagementLicenceList(instrumentBeanListWithPage); animalManagementReturnParam.setUnitMap(animalManagementCollector.getUnitMap()); //单位名称 animalManagementReturnParam.setZoneMap(animalManagementCollector.getZoneMap()); //地区 long endtime = System.currentTimeMillis(); animalManagementReturnParam.setTotalTime(StringUtil.millsecondChange(endtime - beginTime, 1)); } //在索引中搜索数据 public List<AnimalManagementLicenceBean> luceneSearch(AnimalManagementCollector animalManagementCollector, AnimalManagementReceiveParam animalManagementReceiveParam) throws IOException { QueryTerm term = new FuzzyQueryTerm(); DXSearcher dxSearcher = new DXSearcher(SQLCreatReader.getReader(SystemConstant.ANIMAL_MANAGEMENT_LICENCE_INDEX_KEY)); if ("1".equals(animalManagementReceiveParam.getFlag())) { //分类检索 term.addTerm("flag", "1", false); } else { if ((!StringUtil.isEmpty(animalManagementReceiveParam.getUnit()))) { term.addTerm("unit1", animalManagementReceiveParam.getUnit(), false); } if ((!StringUtil.isEmpty(animalManagementReceiveParam.getZone()))) { term.addTerm("zone", animalManagementReceiveParam.getZone(), false); } if (!StringUtil.isEmpty(animalManagementReceiveParam.getField())) { if ("1".equals(animalManagementReceiveParam.getField())) { //全部字段 QueryTerm term1 = new FuzzyQueryTerm(); term1.addTerm("lic_number", animalManagementReceiveParam.getSw(), 2); term1.addTerm("unit", animalManagementReceiveParam.getSw(), 2); term.addTerm(term1, 1); } else if ("2".equals(animalManagementReceiveParam.getField())) { //许可证编号 term.addTerm("lic_number", animalManagementReceiveParam.getSw()); } else if ("3".equals(animalManagementReceiveParam.getField())) { //单位名称 term.addTerm("unit", animalManagementReceiveParam.getSw()); } } } dxSearcher.search(term, animalManagementCollector); if (term.getQuery() != null) { System.out.println("搜索字段:" + term.getQuery().toString()); } int begin = animalManagementReceiveParam.getPageSize() * (animalManagementReceiveParam.getCurrentPage() - 1); int end = animalManagementReceiveParam.getPageSize(); scoreDocs = animalManagementCollector.topDocs(begin, end).scoreDocs; totalData = animalManagementCollector.getTotalHits(); animalManagementReturnParam.setTotalData(totalData); List<AnimalManagementLicenceBean> instrumentBeanList = new ArrayList<AnimalManagementLicenceBean>(); FieldHighlighter fieldHighlighter = new FieldHighlighter(animalManagementReceiveParam.getSw()); for (int i = 0; i < scoreDocs.length; i++) { ScoreDoc scoreDoc = scoreDocs[i]; int docID = scoreDoc.doc; Document doc = dxSearcher.doc(docID); AnimalManagementLicenceBean animalManagementLicenceBean = new AnimalManagementLicenceBean(); if (!StringUtil.isEmpty(doc.get("dxid"))) { animalManagementLicenceBean.setDxid(doc.get("dxid")); } if (!StringUtil.isEmpty(doc.get("title"))) { animalManagementLicenceBean.setTitle(fieldHighlighter.getTextFragment(doc.get("title"), false)); } if (!StringUtil.isEmpty(doc.get("type"))) { animalManagementLicenceBean.setType(fieldHighlighter.getTextFragment(doc.get("type"), false)); } if (!StringUtil.isEmpty(doc.get("lic_number"))) { animalManagementLicenceBean.setLic_number(fieldHighlighter.getTextFragment(doc.get("lic_number"), false)); } if (!StringUtil.isEmpty(doc.get("unit"))) { animalManagementLicenceBean.setUnit(fieldHighlighter.getTextFragment(doc.get("unit"), false)); } if (!StringUtil.isEmpty(doc.get("unit1"))) { animalManagementLicenceBean.setUnit1(fieldHighlighter.getTextFragment(doc.get("unit1"), false)); } if (!StringUtil.isEmpty(doc.get("enable_range"))) { animalManagementLicenceBean.setEnable_range(fieldHighlighter.getTextFragment(doc.get("enable_range"), false)); } if (!StringUtil.isEmpty(doc.get("zone"))) { animalManagementLicenceBean.setZone(fieldHighlighter.getTextFragment(doc.get("zone"), false)); } if (!StringUtil.isEmpty(doc.get("url"))) { animalManagementLicenceBean.setUrl(fieldHighlighter.getTextFragment(doc.get("url"), false)); } instrumentBeanList.add(animalManagementLicenceBean); } return instrumentBeanList; } public AnimalManagementReturnParam getAnimalManagementReturnParam() { return animalManagementReturnParam; } public void setAnimalManagementReturnParam(AnimalManagementReturnParam animalManagementReturnParam) { this.animalManagementReturnParam = animalManagementReturnParam; } }
相关推荐
针对传统集中式索引处理大规模数据的性能和效率问题,提出了一种基于文本聚类的检索算法。利用文本聚类算法改进现有的索引划分方案,根据查询与聚类结果的距离计算判断查询意图,缩减查询范围。实验结果表明,所提...
随着信息技术的迅速发展,非结构化知识呈现爆炸性增长,...在未来的应用中,这种基于文本聚类与分布式Lucene的知识检索技术,有望在大数据环境下得到更广泛的应用,为非结构化知识的管理和检索提供更加高效的技术支持。
- **初始化与迭代**:设定聚类数量K,分配初始中心点,然后迭代调整文档的类别归属,直到满足停止条件(如达到预设迭代次数、中心点不再改变等)。 8. **优化与应用**: 可以通过调整参数,如K值、距离阈值等,...
lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....
《深入理解Lucene C#与.NET环境下的应用实践》 Lucene是一款强大的全文搜索引擎库,最初由Apache软件基金会开发,现已成为Apache Lucene项目的一部分。它提供了高效的索引和搜索功能,广泛应用于各类数据检索系统。...
lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0
同时,Unicode支持得到加强,引入了新的查询分析框架,并加入了基于地理位置的查询功能,用户可以根据距离信息对文档进行过滤与排序。 #### 2.9与3.0的对比 虽然2.9版本已经为3.0的到来做出了铺垫,但在3.0正式...
【Lucene 4.7.0 全套JAR包详解】 Lucene是一个开源全文搜索引擎库,由Apache软件基金会开发并维护。它提供了一个高级、灵活的文本搜索API,允许开发者轻松地在应用程序中实现复杂的搜索功能。这次提供的“lucene-...
本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...
该方法将合并磁盘上的索引文件,以减少文件的数量,从而减少搜索索引的时间。 Lucene应用 Lucene应用是指使用Lucene搜索引擎库构建搜索应用程序的过程。Lucene应用程序可以用于各种领域,包括文本搜索、图片搜索和...
Lucene是一款强大的全文搜索引擎库,广泛应用于各种数据检索场景。在C#环境下,利用Lucene进行时间区间搜索是提高数据检索效率和精确度的重要手段。本篇将深入探讨如何在C#中实现Lucene的时间区间查询匹配,以及涉及...
《Lucene in Action》是关于Apache Lucene的权威指南,这本书深入浅出地介绍了全文搜索引擎的构建和优化。Lucene是一个高性能、全文本搜索库,它允许开发人员在应用程序中轻松实现复杂的搜索功能。这本书主要面向...
在搜索引擎和信息检索领域,Apache Lucene 是一个广泛使用的全文索引库,它提供了高效、可扩展的搜索功能。在处理大量数据时,有时我们需要对搜索结果进行分组,以便更好地理解和分析数据。"Lucene group by" 指的...
在IT领域,搜索引擎技术是至关重要的,而Lucene作为一个开源全文搜索引擎库,广泛应用于各种文本检索系统中。本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、...
**Lucene 4.0.0 全文检索引擎工具包** Apache Lucene 是一个高度成熟、广泛使用的开源全文检索库,由Java编写。作为一款搜索引擎工具包,它提供了核心的索引和搜索功能,使得开发者能够快速地在应用程序中集成强大...
《Annotated Lucene 中文版 Lucene源码剖析》是一本深入探讨Apache Lucene的书籍,专注于源码解析,帮助读者理解这个强大的全文搜索引擎库的工作原理。Lucene是一款开源的Java库,它提供了高效的文本搜索功能,被...
【Lucene 简介】 Lucene 是一个强大的开源全文搜索库,由 Java 编写,主要用于为应用程序添加全文检索功能。它不是一个完整的全文搜索引擎应用,而是一个工具包,允许开发者将其集成到自己的软件中,以实现高效、...
Lucene的优势在于其快速的索引速度、稳定的性能以及简便的使用方法,加之其开源免费的特性,近年来在众多领域得到了广泛应用。 Lucene的设计核心是索引机制,它将信息存储为一系列索引文件,这些文件的结构设计得...
"计算机专业外文翻译(lucene相关)" 本文翻译了论文"Scale-up x Scale-out: A Case Study using Nutch/Lucene",介绍了计算机专业领域中关于Lucene相关的知识点。 Scale-up vs Scale-out 论文中讨论了两个相对...
**Lucene 2.0 API 和 Lucene 3.0 API 深度解析** Lucene 是一个由 Apache 软件基金会开发的全文搜索引擎库,它为开发者提供了在 Java 应用程序中实现高性能、可扩展的全文搜索功能的能力。Lucene 的 API 设计得相当...