luceneが得たクラスタリングの数
13527 ワード
1.baseCollertorを定義する
2.自分のcollertorを書いて、2つの分類があって、1つは単位名の分類で、1つは地区の分類です
3.カスタムフィールド
4.web.xml設定初期化
5.InitServiceletでの初期化
6.検索で使用
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を書いて、2つの分類があって、1つは単位名の分類で、1つは地区の分類です
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.カスタムフィールド
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.InitServiceletでの初期化
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;
}
}