codecamp

关于Solr搜索的概述

Solr 为搜索提供了丰富而灵活的功能。为了理解这种灵活性的程度,从对 Solr 搜索所涉及的步骤和组件的概述开始是很有帮助的。

当用户在 Solr 中运行搜索时,搜索查询由一个请求处理程序处理。请求处理程序是一个 Solr 插件,用于定义在 Solr 处理请求时要使用的逻辑。Solr 支持各种请求处理程序。有些是为处理搜索查询而设计的,有些则是用来管理索引复制等任务的。

搜索应用程序默认选择特定的请求处理程序。此外,还可以将应用程序配置为允许用户以不同的请求处理程序的首选项替代默认选择。

Solr 查询解析器

为了处理搜索查询,请求处理程序调用查询解析器,该解析器解释查询的术语和参数。不同的查询解析器支持不同的语法。Solr 默认的查询解析器被称为标准查询解析器,或者更常见的就是 “lucene” 查询解析器。Solr 还包括 DisMax 查询解析器和扩展的 DisMax(eDisMax)查询解析器。标准查询解析器的语法允许在搜索中更加精确,但是 DisMax 查询解析器更能容忍错误。DisMax 查询解析器旨在提供类似于流行的搜索引擎(如 Google)的体验,这些搜索引擎很少向用户显示语法错误。扩展的 DisMax 查询解析器是 DisMax 的改进版本,它处理完整的 Lucene 查询语法,同时仍然容忍语法错误。它还包括几个附加功能。

另外,所有的查询解析器都包含通用的查询参数。

查询解析器的输入可以包括:

  • 搜索字符串——即在索引中搜索的术语。
  • 用于微调查询的参数,通过增加特定字符串或字段的重要性,通过在搜索项之间应用布尔逻辑,或者通过从搜索结果中排除内容。
  • 用于控制查询响应的表示的参数,诸如指定将呈现结果的顺序或者限制对搜索应用的模式的特定字段的响应。

搜索参数也可以指定一个过滤器查询。作为搜索响应的一部分,过滤器查询针对整个索引运行查询并缓存结果。由于 Solr 为过滤器查询分配了单独的缓存,所以过滤器查询的战略使用可以提高搜索性能。(尽管名称相似,但查询过滤器与分析过滤器无关。过滤器查询在搜索时对索引中已有的数据执行查询,而分析过滤器(如Tokenizers)根据指定的规则解析用于索引的内容。

搜索查询可以请求在搜索响应中突出显示某些术语;也就是说,选定的术语将显示在彩色框中,以便在搜索结果的屏幕上“跳出”。突出显示可以使搜索中返回的长文档中的相关段落更容易找到。Solr 支持多项高亮显示。Solr 包含一组丰富的搜索参数,用于控制如何突出显示术语。

搜索响应也可以配置为包含以突出显示的文本为特色的片段(文档摘录)。流行的搜索引擎,如谷歌和 Yahoo ! 在搜索结果中返回代码片段:3-4行文本,提供搜索结果的描述。

为帮助用户找到所需的内容,Solr 支持两种特殊的搜索结果分组方式,以帮助进一步探索:faceting 和集群。

faceting 是将搜索结果安排到不同的类别(基于索引项)。在每个类别中,Solr 报告了相关术语的命中次数,称为 facet 约束。faceting 可让用户轻松浏览网站(如电影网站和产品评论网站)上的搜索结果,这些网站的分类和许多项目都属于一个类别。

下面的屏幕截图显示了 CNET 网站(CBS Interactive Inc.)(这是第一个使用 Solr 的站点)的一个示例。

Solr搜索

faceting 使用在索引搜索应用程序时定义的字段。在上面的示例中,这些字段包括对描述数码相机有用的信息类别:制造商、分辨率和缩放范围。

集群组搜索结果是通过执行搜索时发现的相似性而非搜索内容时得到的。集群的结果往往缺乏在 faceting 搜索结果中找到的整齐的层次结构,但集群仍然是有用的。它可以揭示搜索结果之间意想不到的共同点,它可以帮助用户排除与他们真正搜索的内容无关的内容。

Solr 还支持名为 MoreLikeThis 的功能,该功能使用户能够提交新的查询,这些查询专注于在以前的查询中返回的特定术语。MoreLikeThis 查询可以利用 faceting 或集群来为用户提供额外的帮助。

称为响应书写器(response writer)的 Solr 组件管理查询响应的最终呈现。Solr 包含各种响应编写器,包括 XML 响应编写器和 JSON 响应编写器。

下图总结了搜索过程的一些关键要素。

Solr搜索

Solr自定义更新请求处理器:UIMA集成
Solr快速搜索界面
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

SolrCloud

SolrCloud配置和参数

如何使用AsciiDoc

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }