lucene gets the number of clusters

1. First define a 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();
	}
	
	/**
	 * Key code, don't change it
	 */
	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. Write your own collertor, there are two classifications, one is the unit name classification, the other is the regional classification

 

public class AnimalManagementCollector extends BaseCollector {
    private Map<String, Integer> unitMap = new HashMap<String, Integer>();//Unit name
    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. Customize fields

 

public class AnimalManagementFields {
    public static String[] UNIT_CACHE; //Unit name
    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. Set initialization in 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. Initialize in 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("Initialization_Animal management license_Clustering information time:" + StringUtil.millsecondChange(endTime1 - beginTime1, 1) + "seconds");

        } catch (IOException e) {
            e.printStackTrace ();
        }
    }

 

6. Use in Search

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()); //Unit name
        animalManagementReturnParam.setZoneMap(animalManagementCollector.getZoneMap()); //地区

        long endtime = System.currentTimeMillis();
        animalManagementReturnParam.setTotalTime(StringUtil.millsecondChange(endtime - beginTime, 1));
    }

    //Search data in index
    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())) { //Classification retrieval
            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())) { //All fields
                    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())) { //License number
                    term.addTerm("lic_number", animalManagementReceiveParam.getSw());
                } else if ("3".equals(animalManagementReceiveParam.getField())) { //Unit name
                    term.addTerm("unit", animalManagementReceiveParam.getSw());
                }
            }
        }
        dxSearcher.search(term, animalManagementCollector);
        if (term.getQuery() != null) {
            System.out.println("Search field:" + 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;
    }
}

 

 

 

 

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326605935&siteId=291194637