本次分析以Solr3.3是最新的版本为准,
Solr3.3接收客户端的查询索引,新建索引请求都是通过过滤器SolrDispatchFilter来提交给SolrCore的Eexecute方法的。而WEB
.xml文件里的Servlet都不取作用的。SolrDispatchFilter主要是根据当前请求路径的PATH,客户端发起的请求PATH主要如下几类:
1 /admin 以adinm开头的则到Solr的管理页面。
2 /select,/update 这类的为对应的Handler /select 即搜索请求,对应的handler为 SearchHandler,/update新建,更新索引对应的handler为XmlUpdateRequestHandler,这里主要讲一下 Solr是怎么对新建索引的XML格式的请求做解析的。
新建索引的命令如下:
<add><doc boost=2.1><field name="id">222</field></doc></add>
XmlUpdateRequestHandler 类是ContentStreamHandlerBase的子类,处理的方法在ContentStreamHandlerBase类的
handleRequestBody方法,该方法的代码有:
//创建一个xml的解析器,实类为XMLLoader XMLLoader继承抽象的ContentStreamLoader
ContentStreamLoader documentLoader = newLoader(req, processor);
documentLoader.load(req, rsp, stream);//开始读取要创建的doc信息。
主要代码如下:
对<add>标签的处理如下:
String currTag = parser.getLocalName();
if (currTag.equals(XmlUpdateRequestHandler.ADD)) {
XmlUpdateRequestHandler.log.trace("SolrCore.update(add)");
addCmd = new AddUpdateCommand();
boolean overwrite = true; // the default
Boolean overwritePending = null;
Boolean overwriteCommitted = null;
//判断add标签是否有其他的属性,主要包过如下几个:
//overwrite,allowDups,commitWithin,overwritePending,overwriteCommitted
for (int i = 0; i < parser.getAttributeCount(); i++) {
String attrName = parser.getAttributeLocalName(i);
String attrVal = parser.getAttributeValue(i);
if (XmlUpdateRequestHandler.OVERWRITE.equals(attrName)) {
overwrite = StrUtils.parseBoolean(attrVal);
} else if (XmlUpdateRequestHandler.ALLOW_DUPS.equals(attrName)) {
overwrite = !StrUtils.parseBoolean(attrVal);
} else if (XmlUpdateRequestHandler.COMMIT_WITHIN.equals(attrName)) {
addCmd.commitWithin = Integer.parseInt(attrVal);
} else if (XmlUpdateRequestHandler.OVERWRITE_PENDING.equals(attrName)) {
overwritePending = StrUtils.parseBoolean(attrVal);
} else if (XmlUpdateRequestHandler.OVERWRITE_COMMITTED.equals(attrName)) {
overwriteCommitted = StrUtils.parseBoolean(attrVal);
} else {
XmlUpdateRequestHandler.log.warn("Unknown attribute id in add:" + attrName);
}
}
// check if these flags are set
if (overwritePending != null && overwriteCommitted != null) {
if (overwritePending != overwriteCommitted) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
"can't have different values for 'overwritePending' and 'overwriteCommitted'");
}
overwrite = overwritePending;
}
//通过下面三行代码,起作用的就是overwrite
addCmd.overwriteCommitted = overwrite;
addCmd.overwritePending = overwrite;
addCmd.allowDups = !overwrite;
对<doc>标签的处理如下:
else if ("doc".equals(currTag)) {
XmlUpdateRequestHandler.log.trace("adding doc...");
addCmd.clear();
addCmd.solrDoc = readDoc(parser);
}
readDoc方法主要是读取<doc>标签和<field>的读取<doc>代码如下:
//Solr 把Luence的Doc封装为SolrInputDocument
SolrInputDocument doc = new SolrInputDocument();
String attrName = "";
for (int i = 0; i < parser.getAttributeCount(); i++) {
attrName = parser.getAttributeLocalName(i);
if ("boost".equals(attrName)) {
doc.setDocumentBoost(Float.parseFloat(parser.getAttributeValue(i)));
} else {
XmlUpdateRequestHandler.log.warn("Unknown attribute doc/@" + attrName);
}
}
从上面的代码可以看出,<doc>标签可以有属性boost,(<doc boost="2">)即可以给该doc设置权重。以改变评分。
读取field的代码就不贴了,相信读者也会想到和上面的是一个模式,会读取 field的name,boost,属性,像<doc>一样,
我们也可以给特定的field设置权重。遇到</field>标签时,代码如下:
doc.addField(name, text.toString(), boost);
boost = 1.0f;
从上面两行代码可以看出,每一个field字段默认的boost为1.0.
Solr解析完<add>命令,创建一个SolrInputDocument 对象,那Solr是怎么把SolrInputDocument 对象转变为luence
的doc对象的呢,在创建时,Solr创建了一个process 这个process是RunUpdateProcessor的实例,上面readDoc方法完成后,返回SolrInputDocument 实例,然后调用RunUpdateProcessor的processAdd方法。把SolrInputDocument 对象转变为luence
doc对象。代码如下:
public void processAdd(AddUpdateCommand cmd) throws IOException {
//转变doc对象
cmd.doc = DocumentBuilder.toDocument(cmd.getSolrInputDocument(), req.getSchema());
//主要是把luence doc写到内存索引
updateHandler.addDoc(cmd);
super.processAdd(cmd);
}
分享到:
相关推荐
1. **建立索引**:Solr通过分析和索引文档内容来创建索引,这个过程包括分词、词干提取、停用词过滤等文本预处理步骤。在本例中,虽然没有具体的源代码,但我们可以假设这些库文件如`wstx-asl-3.2.7.jar`(Woodstox ...
源码分析是深入理解一个软件系统工作原理的重要途径,对于Solr这样的复杂系统尤其如此。这里我们将围绕"solr-9.0.0-src.tgz"这个源码包,详细探讨其主要组成部分、核心功能以及开发过程中的关键知识点。 1. **Solr...
8. **源码分析**: - 对于研究Solr的开发者,源码提供了深入理解其工作原理的机会,可以定制和优化Solr以满足特定需求。 综上所述,Solr 4.5版本是一个功能强大且高度可定制的搜索引擎平台,适合各种规模的企业...
源代码实例是学习Solr内部工作原理和自定义功能的关键资源,尤其对于开发者而言,深入理解源码有助于提升系统的优化和扩展能力。 在Solr 4.0版本中,`solr.xml`是Solr的核心配置文件,它定义了Solr实例的基本设置,...
索引是Solr的核心任务之一,它涉及文本预处理(分词、去除停用词等)、字段分析、倒排索引的创建等步骤。在"lucene"目录下的源代码中,你可以看到这些过程的具体实现,如Analyzer、Tokenizer和Filter类。 **查询...
每个SolrCore需要定义自己的索引结构,这可以通过创建一个名为`solrconfig.xml`的配置文件来完成。此外,还需要为每个SolrCore指定一个独一无二的名字,并在`solr.xml`中注册到Zookeeper。这样,Solr就能知道集群中...
**Solr 教程**:文档中的教程部分为初学者提供了快速入门的方法,通过简单的步骤演示了如何安装 Solr、创建索引以及执行基本的查询操作。 **快速概览**:这部分内容概述了 Solr 的核心概念和技术特点,包括其架构、...
1. 创建索引字段:在开始索引之前,需要在Solr的Schema.xml文件中定义对应的字段类型和字段。字段类型如TextField,DateField等,字段如id,title,content等。 2. JSON数据格式化:确保JSON数据符合Solr的索引需求...
源代码包"apache-solr-4.0.0-ALPHA-src.gz"包含了Solr 4.0的全部源代码,可以用于深入理解Solr的工作原理、内部架构以及核心功能。以下是关于这个源代码包的一些关键知识点: 1. **Solr 架构**:Solr采用分层架构,...
**4.4 使用SolrJ创建索引** - 提供使用SolrJ进行索引操作的具体示例。 **4.5 Solrj包的结构说明** - **4.5.1 CommonsHttpSolrServer**:通过HTTP协议与Solr服务器交互的客户端类。 - **4.5.2 ...
它使得开发者能够方便地创建、更新和查询 Solr 索引,而无需关心底层通信细节。`solr-solrj` 模块中的 `org.apache.solr.client.solrj` 包包含了各种客户端工具,如 HTTP 客户端、请求对象、响应解析器等。此外,`...
索引是Solr存储和搜索的基础,通过分析文档生成倒排索引,以实现快速的全文检索。索引过程包括分词、建立词典、创建倒排索引等步骤。 1.3.2 搜索 搜索时,Solr接收用户的查询请求,通过解析查询字符串,查找索引中...
- **兼容性**:Solr创建的索引与Lucene搜索引擎库完全兼容,这意味着Solr可以读取并利用其他Lucene应用程序中已有的索引。 - **数据导入**:从1.3版本开始,Solr支持从数据库(JDBC)、RSS提要、Web页面和文件中导入...
Solr的核心功能包括文本分析、索引构建、查询处理和结果排序。它的强大之处在于其灵活性,可以通过配置文件定制搜索行为,支持多种数据源,如CSV、JSON、XML等,同时具备分布式搜索能力,能够处理大量数据和高并发...
在实际应用中,理解Solr的工作原理、熟练掌握配置与管理技巧、以及根据业务需求优化索引和查询策略,将有助于构建高效、可靠的搜索解决方案。对于更深入的学习,可以参考官方文档、博客文章(如给出的博文链接)和...
本文将基于《Apache Solr 架构分析内部设计篇PDF》提供的内容,深入探讨Solr的核心架构与设计原理。 #### 二、Solr简介 ##### 2.1 对于用户而言的Solr - **信息检索应用**:Solr是一款用于处理大规模数据的信息...
Apache Solr是一款功能丰富的全文搜索服务器,而Tika则是一个内容分析引擎,擅长从不同格式的文件中提取结构化信息,如文本、元数据等。 首先,我们需要理解Apache Solr的基本工作原理。Solr构建在Lucene之上,提供...
三、源码分析 "solr-5.5.2-src.tgz"包含的源代码可以让开发者深入理解Solr的工作机制,包括以下部分: 1. **核心组件**:如索引、查询解析、排序、分面搜索等的实现。 2. **插件系统**:Solr允许用户自定义请求...
6. **源码分析**:研究"camel-spring-amqp-master"中的源代码,了解Camel组件的实现细节,以及如何将其实例化并配置到Spring应用中。 7. **测试与调试**:学习如何编写和运行单元测试,以确保Camel路由和消息处理...