📄 searcher.java
字号:
package com.ht.gis.search;
import java.io.*;
import java.util.Date;
import javax.servlet.ServletContext;
import org.apache.lucene.search.*;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
import com.ht.gis.service.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
public class Searcher {
private static Log log = LogFactory.getLog("WebGIS");
private IndexSearcher searcher = null;
private ServletContext servContext = null;
private String OutMapDir = null;
public Searcher(ServletContext servContext)throws Exception {
this.servContext = servContext;
OutMapDir = servContext.getRealPath("luceneIndex");
File indexDir = new File(OutMapDir);
if (!indexDir.exists()) {
log.error("索引输出目录: " + OutMapDir + "不存在!");
return;
}
reset();
}
public void reset()throws Exception{
try{
FSDirectory directory = FSDirectory.getDirectory(OutMapDir, false);
searcher = new IndexSearcher(directory);
}catch(FileNotFoundException e){log.error("没有建立索引,启动后请进行初始化索引操作!");}
}
//================= 全文搜索操作,返回XML字符串==================
public String search(String queryStr, String levelName, String levelCode)throws Exception{
try{
Analyzer analyzer = new StandardAnalyzer();
QueryParser parser = new QueryParser("name" , analyzer);
Query query = parser.parse(queryStr);
//=========== 组织返回XML ==============
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
org.w3c.dom.Document XmlDoc = db.newDocument();
Node root = XmlDoc.appendChild(XmlDoc.createElement("Htinfo"));
Node head = root.appendChild(XmlDoc.createElement("head"));
Node body = root.appendChild(XmlDoc.createElement("body"));
Node type = head.appendChild(XmlDoc.createElement("type"));
((org.w3c.dom.Element)root).setAttribute("version", "1.0");
type.appendChild(XmlDoc.createTextNode("搜索结果"));
Hits hits = searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
Document luceneDoc = hits.doc(i);
Node row = body.appendChild(XmlDoc.createElement("row"));
Node id = row.appendChild(XmlDoc.createElement("id"));
Node name = row.appendChild(XmlDoc.createElement("name"));
Node addr = row.appendChild(XmlDoc.createElement("addr"));
Node photo = row.appendChild(XmlDoc.createElement("photo"));
id.appendChild(XmlDoc.createTextNode(luceneDoc.get("id")));
name.appendChild(XmlDoc.createTextNode(luceneDoc.get("name")));
addr.appendChild(XmlDoc.createTextNode(luceneDoc.get("addr")));
photo.appendChild(XmlDoc.createTextNode(luceneDoc.get("photo")));
}
Node row = body.appendChild(XmlDoc.createElement("row"));
Node id = row.appendChild(XmlDoc.createElement("id"));
Node name = row.appendChild(XmlDoc.createElement("name"));
Node addr = row.appendChild(XmlDoc.createElement("addr"));
Node photo = row.appendChild(XmlDoc.createElement("photo"));
id.appendChild(XmlDoc.createTextNode("韦建生"));
name.appendChild(XmlDoc.createTextNode("建功立业"));
addr.appendChild(XmlDoc.createTextNode("addr"));
photo.appendChild(XmlDoc.createTextNode("photo"));
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
StringWriter sw = new StringWriter();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new DOMSource(XmlDoc), new StreamResult(sw));
String XMLString = sw.toString();
return XMLString;
}catch(Exception e){log.error(e);}
return null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -