`
huanglz19871030
  • 浏览: 248660 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Searching过程详解

 
阅读更多

1.拦截请求,解析请求并构建相应的handler。

发送检索请求,例如:http://localhost:8983/solr3.5/core2/select/?q=*%3A*&version=2.2&start=0&rows=10&indent=on

首先他将被SolrDispatchFilter拦截。

doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

通过对request的分析,获知当前request是做什么的(/select),并构造相应的handler(SearchHandler)。

 

2.SolrCore出面处理上层工作(具体工作交由handler处理)

将handler、SolrQueryRequest、SolrQueryResponse交由solrCore的execute方法处理

public void execute(SolrRequestHandler handler, SolrQueryRequest req, SolrQueryResponse rsp)

在该方法中主要还是由handler来完成的。

SolrRequestHandler是一个接口,他主要的方法就是:

public void handleRequest(SolrQueryRequest req, SolrQueryResponse rsp);

SolrRequestHandler的实现类的结构图如下:

其中RequestHandlerBase为大部分的Handler实现了部分功能,主要包括

public void handleRequest(SolrQueryRequest req, SolrQueryResponse rsp){
  ......
  handleRequestBody( req, rsp );
  ......
}

然而具体怎么做就交给具体的子类去执行了!(handleRequestBody( req, rsp );)

例如:这里是做检索,那么就交由SearchHandler处理。

(这里的设计方式有点类似于servlet,GenericSerlet实现了一些公用方法,而具体的则有其子类完成,例如HttpServlet)

 

3.SearchHandler具体的检索过程

现在的检索没有使用shards,在跟踪代码的过程中,发现以下过程是检索的主要环节。

if(!rb.isDebug()) {
        // Process
        for( SearchComponent c : components ) {
         <strong> c.process(rb);</strong>
        }
      }

从中可知真正的检索需要经过多个SearchComponent,在当前的实验环境下包括6个,如下:

 

4.各个SearchComponent配合工作完成检索

我们先重点了解QueryComponent。

获得SolrIndexSearcher,这个对象是检索的主要执行者。

同时获取SolrIndexSearcher.QueryCommand、SolrIndexSearcher.QueryResult,并将其作为查询条件和查询结果提交给SolrIndexSearcher进行检索。

searcher.search(result,cmd);

在SolrIndexSearcher中search方法如下:

public QueryResult search(QueryResult qr, QueryCommand cmd) throws IOException {
    <strong>getDocListC(qr,cmd);</strong>
    return qr;
  }

getDocListC又是一个比较复杂的方法,在这里加入的cache。

如果当前检索被缓存了(缓存也是个重点内容,后续详细分析!),那么直接返回结果,否则重新进行检索,检索的方法是:

private void getDocListNC(QueryResult qr,QueryCommand cmd)

在该方法中,和我们使用lucene进行检索十分相似,采用的具体方法是:

super.search(query, luceneFilter, collector);

检索完成将结果进行封装,放入QueryResult当中。

qr.setDocList(new DocSlice(0,sliceLen,ids,scores,totalHits,maxScore));

检索完成后,将结果放入缓存中,“造福后人”!

至此QueryComponent的工作就算完成了。

如果做简单查询(如:http://localhost:8983/solr3.5/core2/select/?q=*%3A*&version=2.2&start=0&rows=10&indent=on

那么后面5个Component就直接过了(没有真正被执行)。

 

5.收尾工作

将结果封装好,写入相应的ResponseHeaders,关闭SolrQueryRequest、solrCore。

 

-----------------------------------------------------

以上是solr-searching最粗略的过程,本着先脉络后细节的思想,以后再对各个重要环节做深入分析。

searching主要执行方法如下:

SolrDispatchFilter(doFilter,execute)

->SolrCore(execute)

->RequestHandlerBase(handleRequest)

->SearchHandler(handleRequestBody) //有可能执行多个Component

->QueryComponent(process)

->SolrIndexSearcher(search,getDocListC)

转载自:http://www.cnblogs.com/huangfox/archive/2012/02/09/2344686.html

分享到:
评论

相关推荐

    常用算法和数据结构(Sorting and Searching Algorithms)

    ### 常用算法与数据结构详解 #### 一、引言 《常用算法和数据结构(Sorting and Searching Algorithms)》是一本由Thomas Niemann编写的实用指南书,旨在为读者提供一系列关于排序和查找算法的基本知识。这本书...

    hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

    TVM量化流程详解 #### 2.1 注释(Annotate) - **定义与目的**:注释阶段是在模型中插入模拟量化操作的过程。这一步是为了模拟从浮点量化到整数的舍入误差和饱和误差。 - **实现方式**: - 通过注册特定的注释...

    hhhhhhhhhhhhhhhhhhhhh

    ### 搜索阶段(Searching Phase) - **Learning Algorithm**:学习算法用于探索不同的量化策略,以找到最优解。它根据硬件描述和模型拓扑调整量化参数。 - **Hardware Description**:提供硬件的详细信息,如支持的...

    Lucene 全文检索 之 详解

    **全文检索技术与Lucene详解** 全文检索是一种在大量文本数据中快速查找包含特定词汇或短语的信息的技术。在互联网时代,随着数据量的爆炸性增长,高效、准确的全文检索变得至关重要。Lucene,由Apache软件基金会...

    MTK键盘锁与解锁详解

    ### MTK键盘锁与解锁详解 #### 一、MTK键盘锁概述 MTK平台作为移动设备中的一个重要组成部分,提供了多种安全性和用户体验的功能。其中,键盘锁作为一种基本的安全功能,在防止误操作、保护用户隐私等方面起到了...

    高考英语复习:高考英语词汇400题及详解(三)[精选].doc

    此外,“while he was searching”是一个时间状语从句,表明动作发生的时间。 3. 阅读理解与推理能力:考生需要理解题目的情境,例如第103题,通过上下文推断出小偷在搜寻过程中会四处散落纸张的行为,从而选择...

    c#实现三国华容道的求解路线与窗体路线演示

    《C#实现三国华容道求解与演示详解》 三国华容道,这是一款源自中国古老智慧的游戏,挑战玩家的逻辑思维与空间想象能力。本文将深入探讨如何使用C#编程语言,实现华容道的求解算法及动态演示功能。 首先,我们要...

    lire图片搜索图片样例

    **Lire图片搜索图片样例详解** 在信息技术领域,图像搜索是不可或缺的一部分,尤其是在大数据和人工智能的背景下。Lire(Lucene Image REtrieval)是一个Java库,它为图像搜索引擎提供了一种简单而高效的方法。这个...

    机器学习方面论文

    1. **第一列文档碎片识别**:通过空白区域搜索算法(Blank-Area-Searching Algorithm)识别原始文档的第一列文档碎片。这一阶段的目标是确定文档的起始部分,为后续的拼接提供基础。 2. **相邻文档碎片匹配**:采用...

    一种基于范围搜索的并行多维分类算法PRSMC.pdf

    【PRSMC算法详解】 PRSMC(Parallel Range-based Searching Multidimensional Classification)是一种高效的并行多维分类算法,特别适用于处理高速网络应用中的多维度数据包分类问题。该算法充分利用高性能并行...

    高中英语必修二UnitLanguage pointsPPT课件.pptx

    【知识点详解】 1. 文物(Cultural Relics)与稀有和价值的关系 文物并不总是需要同时具备稀有和价值这两个特征。文物通常是指具有历史、艺术或科学价值的物品,它们反映了某个时期的文化、社会或技术发展。"rare...

    Lucene.net中文帮助文档

    **Lucene.NET中文帮助文档详解** Lucene.NET是一款开源全文搜索引擎库,它是Apache Lucene项目在.NET框架下的实现。这个库提供了高级的信息检索服务,包括文本分析、索引和搜索功能,广泛应用于各种需要高效搜索...

    Nutch 0.8笔记NUTCHNUTCH

    【Nutch 0.8 知识点详解】 Nutch 是一个开源的、基于 Lucene 的网络搜索引擎项目,它提供了一套完整的搜索引擎解决方案,包括网页抓取、索引和搜索功能。Nutch 0.8 版本尤其值得关注,因为它完全使用 Hadoop 进行了...

    lucene学习资料收集

    5. **搜索(Searching)**:通过查询对象,Lucene能高效地在索引中查找匹配的文档,返回排名靠前的结果。搜索算法基于TF-IDF和 BM25等。 6. **排序与评分(Scoring)**:Lucene根据相关性对搜索结果进行排序,...

    分布式搜索引擎nutch开发

    分布式搜索引擎Nutch开发详解 Nutch是一款开源的、基于Java实现的全文搜索引擎,它主要用于构建大规模的网络爬虫系统,并提供了对抓取的网页进行索引和搜索的功能。Nutch与Hadoop紧密集成,能够充分利用分布式计算...

    基于lucene搜索引擎的java源码

    **基于Lucene搜索引擎的Java源码详解** Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。此Java源码包提供了一个全面的示例,展示了如何利用Lucene进行索引创建、更新(增量索引)以及搜索操作。...

    m2eclipse-book

    - **Searching For Maven Artifacts and Java classes**:演示如何搜索Maven仓库中的构件和Java类。 - **Indexing Maven Repositories**:解释了索引Maven仓库的重要性及其操作步骤。 - **Using the Form-based ...

    lucene搜索引擎

    **Lucene 搜索引擎详解** Lucene 是一个由 Apache 软件基金会开发的全文搜索引擎库,它在 Apache Jakarta 项目下属于一个重要的开源组件。Lucene 的设计目标是为软件开发者提供一个简单且可扩展的接口,以便在他们...

    Boyer–Moore–Horspool algorithm

    ### Boyer–Moore–Horspool 算法详解 #### 一、算法概述 Boyer–Moore–Horspool 算法是一种高效的字符串搜索算法,它由 Robert S. Boyer 和 J Strother Moore 在 1977 年提出,并在后续的研究中得到了进一步的...

Global site tag (gtag.js) - Google Analytics