`

lucene得到聚类的数量

 
阅读更多

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;
    }
}

 

 

 

 

  • 大小: 24.9 KB
分享到:
评论

相关推荐

    基于文本聚类与分布式Lucene的知识检索 (2013年)

    针对传统集中式索引处理大规模数据的性能和效率问题,提出了一种基于文本聚类的检索算法。利用文本聚类算法改进现有的索引划分方案,根据查询与聚类结果的距离计算判断查询意图,缩减查询范围。实验结果表明,所提...

    基于文本聚类与分布式Lucene的知识检索.pdf

    随着信息技术的迅速发展,非结构化知识呈现爆炸性增长,...在未来的应用中,这种基于文本聚类与分布式Lucene的知识检索技术,有望在大数据环境下得到更广泛的应用,为非结构化知识的管理和检索提供更加高效的技术支持。

    TFIDF文本聚类

    - **初始化与迭代**:设定聚类数量K,分配初始中心点,然后迭代调整文档的类别归属,直到满足停止条件(如达到预设迭代次数、中心点不再改变等)。 8. **优化与应用**: 可以通过调整参数,如K值、距离阈值等,...

    lucene,lucene教程,lucene讲解

    lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....

    chinese_lucene.rar_Lucene C#_Lucene for .net_PanGu4Lucene_lucene

    《深入理解Lucene C#与.NET环境下的应用实践》 Lucene是一款强大的全文搜索引擎库,最初由Apache软件基金会开发,现已成为Apache Lucene项目的一部分。它提供了高效的索引和搜索功能,广泛应用于各类数据检索系统。...

    lucene3.0 lucene3.0

    lucene3.0 lucene3.0 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 4.7.0 全套JAR包详解】 Lucene是一个开源全文搜索引擎库,由Apache软件基金会开发并维护。它提供了一个高级、灵活的文本搜索API,允许开发者轻松地在应用程序中实现复杂的搜索功能。这次提供的“lucene-...

    Lucene3.5源码jar包

    本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...

    经典的lucene实例代码及详细解析以及lucene结构流程介绍

    该方法将合并磁盘上的索引文件,以减少文件的数量,从而减少搜索索引的时间。 Lucene应用 Lucene应用是指使用Lucene搜索引擎库构建搜索应用程序的过程。Lucene应用程序可以用于各种领域,包括文本搜索、图片搜索和...

    Lucene时间区间搜索

    Lucene是一款强大的全文搜索引擎库,广泛应用于各种数据检索场景。在C#环境下,利用Lucene进行时间区间搜索是提高数据检索效率和精确度的重要手段。本篇将深入探讨如何在C#中实现Lucene的时间区间查询匹配,以及涉及...

    lucene in action英文版 lucene 3.30包

    《Lucene in Action》是关于Apache Lucene的权威指南,这本书深入浅出地介绍了全文搜索引擎的构建和优化。Lucene是一个高性能、全文本搜索库,它允许开发人员在应用程序中轻松实现复杂的搜索功能。这本书主要面向...

    Lucene group by ,分组实现

    在搜索引擎和信息检索领域,Apache Lucene 是一个广泛使用的全文索引库,它提供了高效、可扩展的搜索功能。在处理大量数据时,有时我们需要对搜索结果进行分组,以便更好地理解和分析数据。"Lucene group by" 指的...

    Lucene示例 BM25相似度计算

    在IT领域,搜索引擎技术是至关重要的,而Lucene作为一个开源全文搜索引擎库,广泛应用于各种文本检索系统中。本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、...

    lucene-4.0.0完整包

    **Lucene 4.0.0 全文检索引擎工具包** Apache Lucene 是一个高度成熟、广泛使用的开源全文检索库,由Java编写。作为一款搜索引擎工具包,它提供了核心的索引和搜索功能,使得开发者能够快速地在应用程序中集成强大...

    Annotated Lucene 中文版 Lucene源码剖析

    《Annotated Lucene 中文版 Lucene源码剖析》是一本深入探讨Apache Lucene的书籍,专注于源码解析,帮助读者理解这个强大的全文搜索引擎库的工作原理。Lucene是一款开源的Java库,它提供了高效的文本搜索功能,被...

    Lucene简介.介绍

    【Lucene 简介】 Lucene 是一个强大的开源全文搜索库,由 Java 编写,主要用于为应用程序添加全文检索功能。它不是一个完整的全文搜索引擎应用,而是一个工具包,允许开发者将其集成到自己的软件中,以实现高效、...

    Lucene与关系型数据库对比

    Lucene的优势在于其快速的索引速度、稳定的性能以及简便的使用方法,加之其开源免费的特性,近年来在众多领域得到了广泛应用。 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 2.0 API 和 Lucene 3.0 API 深度解析** Lucene 是一个由 Apache 软件基金会开发的全文搜索引擎库,它为开发者提供了在 Java 应用程序中实现高性能、可扩展的全文搜索功能的能力。Lucene 的 API 设计得相当...

Global site tag (gtag.js) - Google Analytics