大家都知道,Solr是一个基于Lucene高可配置的搜索服务器,大部分参数值以及相关优化等等都可以在solrconfig.xml中配置,那么就需要一个能够很快的进行解析和读取配置文件内容的数据结构,为此Solr提供了NamedList结构。
NamedList,一个有序的name/value容器,NamedList不像Map,他具有以下特点:
1、名字可以重复
2、NamedList中的element保持这有序状态
3、可以下标的形式访问Elements
4、name和value都可以为null
NamedList中通过下边访问要快于通过name访问。
NamedList在org.apache.solr.common.util包下面,把配置文件转换成NamedList需要另外两个辅助类DOMUtil和StrUtils, NamedList支持集中简单的数据类型,这个可以在DOMUtil的代码中可以看出,如下:
@SuppressWarnings("unchecked")
public static void addToNamedList(Node nd, NamedList nlst, List arr) {
// Nodes often include whitespace, etc... so just return if this
// is not an Element.
if (nd.getNodeType() != Node.ELEMENT_NODE) return;
String type = nd.getNodeName();
String name = null;
if (nd.hasAttributes()) {
NamedNodeMap attrs = nd.getAttributes();
Node nameNd = attrs.getNamedItem("name");
if (nameNd != null) name=nameNd.getNodeValue();
}
Object val=null;
if ("str".equals(type)) {
val = getText(nd);
} else if ("int".equals(type)) {
val = Integer.valueOf(getText(nd));
} else if ("long".equals(type)) {
val = Long.valueOf(getText(nd));
} else if ("float".equals(type)) {
val = Float.valueOf(getText(nd));
} else if ("double".equals(type)) {
val = Double.valueOf(getText(nd));
} else if ("bool".equals(type)) {
val = StrUtils.parseBool(getText(nd));
} else if ("lst".equals(type)) {
val = childNodesToNamedList(nd);
} else if ("arr".equals(type)) {
val = childNodesToList(nd);
}
if (nlst != null) nlst.add(name,val);
if (arr != null) arr.add(val);
}
NamedList很好的支持嵌套,例如如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<param>
<str name="client">client</str>
<str name="fields">HTTPBody</str>
<lst name="checker">
<str name="class">myclass</str>
<lst name="initArgs">
<arr name="check-fields">
<str>PageTitle</str>
<str>PageContent</str>
</arr>
<lst name="sublist">
<str name="txt">text</str>>
<lst name="child">
<str name="childtext">text</str>>
</lst>>
</lst>>
</lst>
</lst>
</param>
解析上述xml文件,代码如下:
package test;
import java.io.IOException;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.solr.common.util.NamedList;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class NamedListTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String xmlpath = "/param";
getAttrs(xmlpath);
}
private static void getAttrs(String expression) {
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder;
try {
builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("NewFile.xml");
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile(expression);
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
//System.out.println("ssss " + nodes.getLength());
for (int i = 0; i < nodes.getLength(); ++i) {
NamedList<Object> namedList = DOMUtil.childNodesToNamedList(nodes.item(i));
System.out.println(namedList.toString());
NamedList<Object> parserPosDataChecker = (NamedList<Object>) namedList.get("checker");
System.out.println("class " + parserPosDataChecker.get("class")) ;
NamedList<Object> checkList = (NamedList<Object>) parserPosDataChecker.get("initArgs");
ArrayList<String> checkArr = (ArrayList<String>)checkList.get("check-fields");
System.out.println(checkArr.toString());
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XPathExpressionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
代码需要
DOMUtil和StrUtils的支持,这两个可以从Solr源码中直接取出就可以用,解析xml时用到了XPath,不熟悉的同学可以先看看XPath,然后再学习本实例。
分享到:
相关推荐
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的...
solr教程+实例
solr中文解析器以及使用文档,配合blog使用
Solr分词项目工程实例 Solr分词项目工程实例 Solr分词项目工程实例 Solr分词项目工程实例
solr初学者很受用的!讲解了solr怎么创建索引的及其原理,以及查询
solr.warsolr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包...
详细solr安装和介绍
3. solr是什么 2 3.1 solr的功能 3 3.2 solr术语 3 3.2.1 Auto-warming 3 3.2.2 Facet 3 3.3.3 Document 6 3.3.4 Field 6 3.3.5 IndexWriter 6 3.3.6 IndexSearcher 6 3.3.7 Directory 6 3.3.8 Segment 7 3.3.9 ...
lucene的应用.pdf 01solr企业级搜索引擎准备阶段.pdf 02solr企业级搜索引擎实战演练.pdf 适合新手搭建solr使用
solr,redis用java实现的小案例,本项目使用的maven,在使用前需要安装好redis和solr的服务器
JAVA+Solr分词项目工程实例源代码学习
solr schema solrconfig 配置文件解析 solr schema solrconfig 配置文件解析
文档中详细介绍了如何在ubuntu下面安装solr-4.9.0,以及在安装过程中出现的问题和解决办法
solr 安装与配置
附件包含100个以上示例,包括solr.xml、solrconfig.xml等在Jetty、Tomcat等应用服务器下的详细配置。
ZooKeeper实例 + Solr(tomcat)集群部署
原始数据,用来建立索引 博文链接:https://kylinsoong.iteye.com/blog/712704
solr_使用安装介绍
详细介绍了Elasticsearch 和 solr 的区别;是一道经典的java面试题
solr