热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Solr分面搜索(Faceting)

分面搜索(faceting)是基于索引词,将搜索结果组织到不同的分类(categories)中。表示为索引词(terms),以及一个数值代表各个词匹配的文档数。*分面的字段属性:inde
分面搜索(faceting)是基于索引词,将搜索结果组织到不同的分类(categories)中。表示为索引词(terms),以及一个数值代表各个词匹配的文档数。

*分面的字段属性:indexed或docValues之一必须为true, 但不是都必须为true. docValues在很多情况下更高效。

(1) 通用参数


- facet
"true" 启用faceting计数。
"false"或blank或missing value, 不启用faceting, 默认值是blank.

- facet.query      
可以指定Lucene语法形式的任意query来生成faceting计数。默认,自动检查字段的唯一term并返回计数。
使用facet.query来覆盖默认行为,并精确指定你希望计数的词或正则式。典型的实现中,你可以指定多个facet.query参数。
此参数对于基于数值范围(numeric-range-based)和基于前缀(prefix-based)的分面尤为有用。

(2) 字段-值Faceting参数

有若干参数可以用来触发在指定字段的term上进行faceting.

对于文本(text)字段, 如果包含分词等处理,处理后的term可能不是你想要的。如果你想要solr对文本字段既分析(搜索),又做分面处理,使用copyField对字段创建两个版本:一个Text和一个String.

- facet.field       

指定分面字段,可多次指定。至少指定一个,其他参数才有效果。

- facet.prefix      
限制分面term为指定前缀。
 
按字段指定参数(下同):f..facet.prefix 

- facet.contains
限制分面term为包含指定子串(substring)

- facet.contains.ignoreCase    
使用facet.contains时,忽略子串大小写

- facet.sort
count 按计数排序,最高的在前。
index 按字符顺序。

如果facet.limit大于0,默认为count; 否则默认为index

- facet.limit
默认值为100, 负值表示不限.
 
- facet.offset 
默认值0

- facet.mincount
默认值0

- facet.missing
如果设置为true, 会返回匹配查询但没有facet的所有结果的计数。
默认为false.

- facet.method
faceting的算法或方法
enum  枚举字段的所有term,计算匹配term的文档和查询结果文档的交集。推荐用于multi-valued且只有少数值的字段。
fc    (field cache)遍历查询结果文档并计数。目前的实现是使用一个非倒排字段缓存,如果字段既非多值也非tokenized. 
                   对于多值字段,使用filterCache的term filters.
fcs   用于single-valued string字段.

默认是fc.

- facet.enum.cache.minDF (Advanced) 
仅用于facet.method=enum时,指定filterCache使用的最小文档频率。默认值为0
可以减小内存使用,但增加处理时间。

- Over-Request参数
在Solr分布式查询中,每个分片默认请求 top "10+(1.5 * facet.limit)" 的facets. 
facet.overrequest.count 默认10
facet.overrequest.ratio 默认1.5

- facet.threads (Advanced) 
facet.threads=N, N个线程被使用。
0或忽略,只有主线程。
负数,最大Integer.MAX_VALUE个线程。

(3) 范围切面(Range Faceting)
你可以在任何的日期和数值字段上使用Range Faceting.

- facet.range
指定字段。
facet.range=price&facet.range=age
facet.range=lastModified_dt

- facet.range.start
f.price.facet.range.start=0.0&f.age.facet.range.start=10
f.lastModified_dt.facet.range.start=NOW/DAY-30DAYS

- facet.range.end
f.price.facet.range.end=1000.0&f.age.facet.range.start=99
f.lastModified_dt.facet.range.end=NOW/DAY+30DAYS

- facet.range.gap
f.price.facet.range.gap=100&f.age.facet.range.gap=10
f.lastModified_dt.facet.range.gap=+1DAY

- facet.range.hardend
true, 最后一个范围以facet.range.end结束。
false, 最后一个范围以gap宽度的上限结束。

- facet.range.include
lower, 默认,[lower, upper)
upper, (lower, upper]
edge, 第一个和最后一个range包含边界
outer, "before"和"after"包含边界
all,  包括lower, upper, edge, outer

可以指定多次。

- facet.range.other
除了匹配的范围之外,还应计数:
before,  第一个range之前的记录
after,   最后一个range之后的记录
between, 在start和end之间的所有记录
none,    不计数
all,     包括:before,after,between

除all之外,可以多次指定,但none会覆盖其他参数。

- facet.range.method
filter, 默认,使用filterCache
dv,     这种方法可利用docValues.

-  facet.mincount
小于指定计数的范围不会返回

(4) Date切面参数 

弃用(deprecated), 参见range facet

(5) 支点(决策树)分面 Pivot (Decision Tree) Faceting


Pivoting是一个汇总工具,能自动对数据进行排序,计数,求总数和平均。结果通常显示在第二张表中,显示汇总数据。

从另一个角度看,查询产生了一个决策树(Decision Tree), Solr告诉你"对facet A, 约束/计数为X/N, Y/M, 等. 如果约束A为X, 那么B约束计数为S/P, T/Q, 等"
换句话说,如果限定当前的facet结果,那么将提前告诉你字段的下一个facet结果结合。

- facet.pivot
指定pivot字段,多个字段用逗号隔开。

- facet.pivot.mincount
最小数结果数,默认为1.

- Combining Stats Component With Pivots
stats=true
stats.field={!tag=piv1,piv2 min=true max=true}price  # 统计最大值,最小值
stats.field={!tag=piv2 mean=true}popularity          # 平均值
facet=true
facet.pivot={!stats=piv1}cat,inStock
facet.pivot={!stats=piv2}manu,inStock

- Combining Facet Queries And Facet Ranges With Pivot Facets
facet=true
facet.query={!tag=q1}manufacturedate_dt:[2006-01-01T00:00:00Z TO NOW]
facet.query={!tag=q1}price:[0 TO 100]
facet.pivot={!query=q1}cat,inStock

facet=true
facet.range={!tag=r1}manufacturedate_dt
facet.range.start=2006-01-01T00:00:00Z
facet.range.end=NOW/YEAR
facet.range.gap=+1YEAR
facet.pivot={!range=r1}cat,inStock

(6) 区间分面(Interval Faceting)

Interval Faceting听起来像范围分面(range faceting), 但此功能更接近使用了范围查询的分面查询。

- facet.interval
指定字段,可多次指定。
facet.interval=price&facet.interval=size

- facet.interval.set
指定字段的区间值,可多次指定。
f.price.facet.interval.set=[0,10]&f.price.facet.interval.set=(10,100]

Interval语法:

(1,10]
[1,10)
[1,10]
(*,5]
(*,*)
[Abc, Bbc]

改变输出的key名称:
&facet.interval={!key=popularity}some_field 
&facet.interval.set={!key=bad}[0,5] 
&facet.interval.set={!key=good}[5,*]
&facet=true

(7) Faceting的本地(定制)参数

- Tagging和Excluding过滤器

下面的查询,faceting时除doctype:pdf之外的结果全部是0:
q=mainquery&fq=status:public&fq=doctype:pdf&facet=true&facet.field=doctype

下面的查询,Faceting时排除(不考虑)filterQuery:
q=mainquery&fq=status:public&fq={!tag=dt}doctype:pdf&facet=true&facet.field={!ex=dt}doctype

(8) Related Topics

SimpleFacetParameters
Heatmap Faceting (Spatial)

(9) BlockJoin Faceting

如果一个父文档有几个子文档,它们对于Faceting只需要计数1次,通过父文档聚合子文档计数是一个通用的需求。

BlockJoinFacetComponent和BlockJoinDocSetFacetComponent这两个性能有所差异的搜索组件提供了此功能。



推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • python3下载mapbox矢量切片通过观察mapbox的页面开发者工具里的network可以发现,打开矢量切片和字体切片pbf和prite图标的链接, ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
author-avatar
蘇靖雯jingwensu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有