`

Solr 创建索引的原理 源码分析

    博客分类:
  • solr
阅读更多

本次分析以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);
  }

分享到:
评论
2 楼 zkq-java 2012-08-16  
zkq-java 写道
[u][/u]
引用
[i][/i]

    [*]
[img][/img][url][/url][flash=200,200][/flash]
[color=darkred][/color][size=x-small][/size][align=right][/align]

1 楼 zkq-java 2012-08-16  
[u][/u]
引用
[i][/i]

    [*]
[img][/img][url][/url][flash=200,200][/flash]
[color=darkred][/color][size=x-small][/size][align=right][/align]

相关推荐

    solr查询索引

    1. **建立索引**:Solr通过分析和索引文档内容来创建索引,这个过程包括分词、词干提取、停用词过滤等文本预处理步骤。在本例中,虽然没有具体的源代码,但我们可以假设这些库文件如`wstx-asl-3.2.7.jar`(Woodstox ...

    solr(solr-9.0.0-src.tgz)源码

    源码分析是深入理解一个软件系统工作原理的重要途径,对于Solr这样的复杂系统尤其如此。这里我们将围绕"solr-9.0.0-src.tgz"这个源码包,详细探讨其主要组成部分、核心功能以及开发过程中的关键知识点。 1. **Solr...

    solr4.5版本

    8. **源码分析**: - 对于研究Solr的开发者,源码提供了深入理解其工作原理的机会,可以定制和优化Solr以满足特定需求。 综上所述,Solr 4.5版本是一个功能强大且高度可定制的搜索引擎平台,适合各种规模的企业...

    Solr 4.0 源代码实例

    源代码实例是学习Solr内部工作原理和自定义功能的关键资源,尤其对于开发者而言,深入理解源码有助于提升系统的优化和扩展能力。 在Solr 4.0版本中,`solr.xml`是Solr的核心配置文件,它定义了Solr实例的基本设置,...

    solr4.3源代码一

    索引是Solr的核心任务之一,它涉及文本预处理(分词、去除停用词等)、字段分析、倒排索引的创建等步骤。在"lucene"目录下的源代码中,你可以看到这些过程的具体实现,如Analyzer、Tokenizer和Filter类。 **查询...

    solr(中文分词器)集群

    每个SolrCore需要定义自己的索引结构,这可以通过创建一个名为`solrconfig.xml`的配置文件来完成。此外,还需要为每个SolrCore指定一个独一无二的名字,并在`solr.xml`中注册到Zookeeper。这样,Solr就能知道集群中...

    solr7.5官方文档

    **Solr 教程**:文档中的教程部分为初学者提供了快速入门的方法,通过简单的步骤演示了如何安装 Solr、创建索引以及执行基本的查询操作。 **快速概览**:这部分内容概述了 Solr 的核心概念和技术特点,包括其架构、...

    跟益达学Solr5之批量索引JSON数据

    1. 创建索引字段:在开始索引之前,需要在Solr的Schema.xml文件中定义对应的字段类型和字段。字段类型如TextField,DateField等,字段如id,title,content等。 2. JSON数据格式化:确保JSON数据符合Solr的索引需求...

    apache-solr-4.0.0-ALPHA-src.gz官方包

    源代码包"apache-solr-4.0.0-ALPHA-src.gz"包含了Solr 4.0的全部源代码,可以用于深入理解Solr的工作原理、内部架构以及核心功能。以下是关于这个源代码包的一些关键知识点: 1. **Solr 架构**:Solr采用分层架构,...

    solr教材-PDF版

    **4.4 使用SolrJ创建索引** - 提供使用SolrJ进行索引操作的具体示例。 **4.5 Solrj包的结构说明** - **4.5.1 CommonsHttpSolrServer**:通过HTTP协议与Solr服务器交互的客户端类。 - **4.5.2 ...

    solr-parent.rar

    它使得开发者能够方便地创建、更新和查询 Solr 索引,而无需关心底层通信细节。`solr-solrj` 模块中的 `org.apache.solr.client.solrj` 包包含了各种客户端工具,如 HTTP 客户端、请求对象、响应解析器等。此外,`...

    solr1.4教程

    索引是Solr存储和搜索的基础,通过分析文档生成倒排索引,以实现快速的全文检索。索引过程包括分词、建立词典、创建倒排索引等步骤。 1.3.2 搜索 搜索时,Solr接收用户的查询请求,通过解析查询字符串,查找索引中...

    solr 企业搜索引擎教程

    - **兼容性**:Solr创建的索引与Lucene搜索引擎库完全兼容,这意味着Solr可以读取并利用其他Lucene应用程序中已有的索引。 - **数据导入**:从1.3版本开始,Solr支持从数据库(JDBC)、RSS提要、Web页面和文件中导入...

    利用Solr搭建你的搜索引擎

    Solr的核心功能包括文本分析、索引构建、查询处理和结果排序。它的强大之处在于其灵活性,可以通过配置文件定制搜索行为,支持多种数据源,如CSV、JSON、XML等,同时具备分布式搜索能力,能够处理大量数据和高并发...

    solr的使用

    在实际应用中,理解Solr的工作原理、熟练掌握配置与管理技巧、以及根据业务需求优化索引和查询策略,将有助于构建高效、可靠的搜索解决方案。对于更深入的学习,可以参考官方文档、博客文章(如给出的博文链接)和...

    Apache Solr 架构分析内部设计篇PDF

    本文将基于《Apache Solr 架构分析内部设计篇PDF》提供的内容,深入探讨Solr的核心架构与设计原理。 #### 二、Solr简介 ##### 2.1 对于用户而言的Solr - **信息检索应用**:Solr是一款用于处理大规模数据的信息...

    跟益达学Solr5之使用Tika从PDF中提取数据导入索引

    Apache Solr是一款功能丰富的全文搜索服务器,而Tika则是一个内容分析引擎,擅长从不同格式的文件中提取结构化信息,如文本、元数据等。 首先,我们需要理解Apache Solr的基本工作原理。Solr构建在Lucene之上,提供...

    solr-5.5.2-src.tgz

    三、源码分析 "solr-5.5.2-src.tgz"包含的源代码可以让开发者深入理解Solr的工作机制,包括以下部分: 1. **核心组件**:如索引、查询解析、排序、分面搜索等的实现。 2. **插件系统**:Solr允许用户自定义请求...

    solr-cell-4.5.0.zip

    6. **源码分析**:研究"camel-spring-amqp-master"中的源代码,了解Camel组件的实现细节,以及如何将其实例化并配置到Spring应用中。 7. **测试与调试**:学习如何编写和运行单元测试,以确保Camel路由和消息处理...

Global site tag (gtag.js) - Google Analytics