Solr In Action 笔记(1) 之 Key Solr Concepts

Solr In Action 笔记(1) 之 Key Solr Concepts

题记:看了下《Solr In Action》还是收益良多的,只是奈何没有中文版,只能查看英语原版有点类,第一次看整本的英语书,就当复习下英语并顺便做下笔记吧。

1. Solr的框架

从这张图上看Solr的组件还是很齐全以及清楚明了的,但是当你看Solr源码的时候就会发现,哎呀咋看起来这么类呢。

2. Solr的查询方式

上面两张图分别举例了Solr的几个QueryComponent,比如facet,More like this,highlighting ,spatial ,以及spellcheck component  。

3. Solr的优化提示

(1) Solr支持多个Core,可以对Solr的Core按时间划分为历史Core以及现在Core,分别存放以前的历史数据以及现在的数据,或者将Core按使用类别划分。

(2) 提升Solr的并发查询性能的一个方法就是,增加shard以及replica个数,这是由于SolrCloud的查询方式是根据clusterstate.json的shard的顺序进行查询的,当shard和replica个数多的时候,对Solrcloud的并发查询就会进行分流。

4. Lucene的倒排表结构

可以通过以下表格来加深理解倒排表,通过term我们可以快速定位到具体的Document,然后再根据Document快速取出所有stored的field的内容。

5. 查询方式

5.1 BooleanQuery

BooleanQuery是很基础的一个查询方式,它就是对单个或者多个Term用AND,OR,NOT关系连接起来,它主要分为以下几种方式,假设以下的倒排表格式

通过Term Query查询new 和 home就可以分别获取他们的document如下,接下来分别对不同的boolean的方式对home和new的组合进行查询。

5.1.1 REQUIRED TERMS

  • +new +house
  • new AND house

上述两种查询虽然在逻辑上是一致的,但是在物理上还是有区别的,+是单目运算,AND是双目运算。

5.1.2 OPTIONAL TERMS

  • new house
  • new OR house

第一个查询是因为默认为操作符是OR

5.1.3 NEGATED TERMS

  • new house –rental
  • new house NOT rental

这里需要说明一下多个term的boolean查询性能,由于倒排表的特性,对多个term的boolean查询其实是需要先取出来每个term的doc然后再进行处理,也就说有几个term就需要遍历几遍,当然Lucene在这一块是有优化的,以AND为例,请看以下代码:

 1 private int doNext(int doc) throws IOException {
 2     for(;;) {
 3       // doc may already be NO_MORE_DOCS here, but we don‘t check explicitly
 4       // since all scorers should advance to NO_MORE_DOCS, match, then
 5       // return that value.
 6       advanceHead: for(;;) {
 7         for (int i = 1; i < docsAndFreqs.length; i++) {
 8           // invariant: docsAndFreqs[i].doc <= doc at this point.
 9
10           // docsAndFreqs[i].doc may already be equal to doc if we "broke advanceHead"
11           // on the previous iteration and the advance on the lead scorer exactly matched.
12           if (docsAndFreqs[i].doc < doc) {
13             docsAndFreqs[i].doc = docsAndFreqs[i].scorer.advance(doc);
14
15             if (docsAndFreqs[i].doc > doc) {
16               // DocsEnum beyond the current doc - break and advance lead to the new highest doc.
17               doc = docsAndFreqs[i].doc;
18               break advanceHead;
19             }
20           }
21         }
22         // success - all DocsEnums are on the same doc
23         return doc;
24       }
25       // advance head for next iteration
26       doc = lead.doc = lead.scorer.advance(doc);
27     }
28   }

首先,获取符合第一个查询条件的第一个doc ID ,记为A,

第二,遍历其他的查询条件,获取第二个查询条件的doc id,记为B,如果B大于A,说明没有即符合A又符合B的Doc ID,那么第一个查询条件就会尝试获取大于等于B的Doc ID开始新的一轮循环。

第三,如果B刚好等于A,说明即有符合A又有符合B的Doc ID,所以获取第三个查询的条件的Doc ID,记为C,再多A和C进行比较,之后就跟第二步一样。

最后,当遍历所有查询条件,如果A符合所有查询条件则说明返回A,否则就返回最大值表示没有解。

从上面的过程可以看出,多个term的查询性能还是很耗时的。

再者就是多个Term的Boolean的准确性问题:

假设我们查询New AND House,那么结果出来的Document都包含New 和 House,但是如果我查的是要求是New House 连一起的,那么用BooleanQuery出来的结果可能会包含House New,或者 new XXXXX house这样的并不符合要求的结果,这就是Boolean查询的不足之处。

最后我们来看下,Solr是怎么处理Required Term ,OPTIONAL Term, NEGATED Term的评分因子的,以上三个分别对应required,prohibited,optional

 1     public Scorer scorer(AtomicReaderContext context, Bits acceptDocs)
 2         throws IOException {
 3       List<Scorer> required = new ArrayList<>();
 4       List<Scorer> prohibited = new ArrayList<>();
 5       List<Scorer> optional = new ArrayList<>();
 6       Iterator<BooleanClause> cIter = clauses.iterator();
 7       for (Weight w  : weights) {
 8         BooleanClause c =  cIter.next();
 9         Scorer subScorer = w.scorer(context, acceptDocs);
10         if (subScorer == null) {
11           if (c.isRequired()) {
12             return null;
13           }
14         } else if (c.isRequired()) {
15           required.add(subScorer);
16         } else if (c.isProhibited()) {
17           prohibited.add(subScorer);
18         } else {
19           optional.add(subScorer);
20         }
21       }
22
23       if (required.size() == 0 && optional.size() == 0) {
24         // no required and optional clauses.
25         return null;
26       } else if (optional.size() < minNrShouldMatch) {
27         // either >1 req scorer, or there are 0 req scorers and at least 1
28         // optional scorer. Therefore if there are not enough optional scorers
29         // no documents will be matched by the query
30         return null;
31       }
32
33       // simple conjunction
34       if (optional.size() == 0 && prohibited.size() == 0) {
35         float coord = disableCoord ? 1.0f : coord(required.size(), maxCoord);
36         return new ConjunctionScorer(this, required.toArray(new Scorer[required.size()]), coord);
37       }
38
39       // simple disjunction
40       if (required.size() == 0 && prohibited.size() == 0 && minNrShouldMatch <= 1 && optional.size() > 1) {
41         float coord[] = new float[optional.size()+1];
42         for (int i = 0; i < coord.length; i++) {
43           coord[i] = disableCoord ? 1.0f : coord(i, maxCoord);
44         }
45         return new DisjunctionSumScorer(this, optional.toArray(new Scorer[optional.size()]), coord);
46       }
47
48       // Return a BooleanScorer2
49       return new BooleanScorer2(this, disableCoord, minNrShouldMatch, required, prohibited, optional, maxCoord);
50     }

5.2 短语查询

  • "new home" OR "new house"
  • "3 bedrooms" AND "walk in closet" AND "granite countertops"

在BooleanQuery中,分析了它的劣势,查询的不准性,以及性能的耗时。Phrase queries 在查找连着的term时完美的解决以上两个问题,它主要用到了Term Position。下表是带有term position的倒排表格式,term position很清楚明白的记录了,每一个term在其document的位置,虽然它增加了索引文件的大小,但是却为我们的Pharse Query带来了大大的便利。

同样出去new 和 house的信息,可以看出在document 5和8中,new 和 home是连着的,这提高了查询速度也提高了查询质量。就查询质量进行排序,PhraseQuery > BooleanQuery > FuzzyQuery

5.3 FuzzyQuery

明天继续

时间: 2024-12-16 08:52:59

Solr In Action 笔记(1) 之 Key Solr Concepts的相关文章

Solr In Action 笔记(2) 之 评分机制(相似性计算)

Solr In Action 笔记(2) 之评分机制(相似性计算) 1 简述 <这就是搜索引擎>里面对相似性计算进行了简单的介绍. 内容的相似性计算由搜索引擎的检索模型建模,它是搜索引擎的理论基础,为量化相关性提供了一种数学模型,否则没法计算.当然检索模型理论研究存在理想化的隐含假设,即假设用户需求已经通过查询非常清晰明确地表达出来了,所以检索模型的任务不牵扯到对用户需求建模,但实际上这个和实际相差较远,即使相同的查询词,不同用户的需求目的可能差异很大,而检索模型对此无能为力.几种常见的检索模

Solr In Action 笔记(4) 之 SolrCloud分布式索引基础

Solr In Action 笔记(4) 之 SolrCloud Index 基础 SolrCloud Index流程研究了两天,还是没有完全搞懂,先简单记下基础的知识,过几天再写个深入点的.先补充上前文来不及写的内容. 1. Solr.xml的重要配置 Solr.xml的内容如下: 1 <solr> 2 <solrcloud> 3 <str name="host">${host:}</str> 4 <int name="

Solr In Action 笔记(3) 之 SolrCloud基础

Solr In Action 笔记(3) 之 SolrCloud基础 在Solr中,一个索引的实例称之为Core,而在SolrCloud中,一个索引的实例称之为Shard:Shard 又分为leader和replica. 1. SolrCloud的特质 作为分布式搜索引擎的SolrCloud具有以下几个特质: 可扩展性 所谓的可扩展性就是指可以通过扩大集群的规模来实现性能的提升.有两种方式来实现可扩展性,一种是纵向扩展,即加快CPU速度,增加RAM,提升磁盘I/O性能等,另一种是横向扩展,就是分

Solr in action学习笔记 第二章Getting to know Solr

2.1Getting started *Solr实际是使用http通信,所以可以使用任何语言的API *Solr的一个core包含solr配置文件,lucene索引文件和solr的日志文件 在分布式系统的上下文中,成为collection *Solr还提供COre Admin API *query 当query参数设置好,实质上是向solr服务器发送一个http GET请求 搜索参数: 可以自己写到url里,尽量记住常用的搜索参数,对照solrJ的写法 SolrQuery parameters

Solr In Action 中文版 第一章(四、五)

1.1             功能概览1. 4 最后,让我们再按照下面的分类,快速的过一下Solr的主要功能: ·用户体验 ·数据建模 ·Solr 4的新功能 在本书中,为你的用户提供良好的搜索体验会一直贯穿全书的主题.所以我们就从用户体验开始,看看Solr是如何让你的用户感觉到爽的. 1.4.1             用户体验类功能 Solr提供了一系列的重要功能来帮助你搭建一个易用的,符合用户直觉的,功能强大的搜索引擎.不过你需要注意的是Solr仅仅是提供了类REST风格的HTTP AP

Solr in Action 第一章翻译(待整理)

Solr in action读书笔记第一篇第一章   第1章 Solr简介 本章速览: ·搜索引擎处理的数据特性 ·常见搜索引擎用例 ·Solr核心模块介绍 ·选择Solr的理由 ·功能概述 Solr 定义: 可扩展性:Solr可以把建立索引和查询处理的运算分布到一个集群内的多台服务器上. 快速部署:Solr是开源软件,安装和配置都很方便,可以根据安装包内的Sample配置直接上手. 优化搜索 :Solr搜索够快.对于复杂的搜索查询,Solr可以做到亚秒级的处理,通常几十毫秒就能处理完一次复杂查

Solr in Action 翻译完成情况

Solr in action读书笔记章节分布 第一篇 初识Solr 第1章 Solr简介  已完成 第2章 了解Solr   待整理 第3章 Solr关键概念 第4章 Solr配置 第5章 索引 第6章 文本分析 第二篇 Solr核心功能 第7章 执行请求和处理结果 第8章 分组搜索 第9章 高亮显示 第10章 查询推荐 第11章 结果分组.域分组 第12章 构建Solr生产环境 第三篇 Solr高级应用

自译Solr in action中文版

目录 Part 1 初识 SOLR 1 Solr 简介 2 开始熟悉 Solr 3 Solr 核心概念 4 配置 Solr 5 建立索引 6 文本分析 Part 2 Solr 核心功能 7 发起查询 和 处理结果 8 分类索引 9 命中结果高亮 10 查询建议引导 11 结果分组 合并域 12 将Solr产品化 Part 3 Solr 高级应用 13 扩展Solr云 14 多语言搜索 15 复杂数据操作 16 相关性的调整 17 跳出思维定势 附录: A 从源代码编译Solr B 玩转Solr社

Solr In Action 中文版 第一章(一)

1.1我到底需要一个搜索引擎吗? 第一章           Solr 简介 本章速览: ·搜索引擎处理的数据特性 ·常见搜索引擎用例 ·Solr核心模块介绍 ·选择Solr的理由 ·功能概述 伴随着社交媒体.云计算.移动互联网和大数据等技术的高速发展,我们正迎来一个令人激动的计算时代.软件架构师们开始面对的主要挑战之一,便是如何处理全球巨大的用户基数所产生及使用的海量数据.此外,用户们开始期待在线软件应用永远都是稳定可用的,并且能够一直保持响应,这对应用就提出了更高的可扩展性和稳定性需求.为了