2023年7月24日发(作者:)
SOLR FACET学习笔记
文件ID
文件名
相应Module
开发类型
文件内容
参考资料
修改记录
SOLR FACET学习笔记.DOCX
学习总结
Web开发
本文主要介绍solr中facet的基本应用
solr_train自动完成项目代码
日期
作者
Version
修改事由
目录
一.
二.
1.
2.
3.
三.
四.
1.
FACET简介 ···························································································································· 3
FACET字段 ···························································································································· 3
适宜被FACET的字段 ··················································································································· 3
FACET字段的要求 ························································································································ 3
特殊情况 ····································································································································· 3
FACET组件 ···························································································································· 4
FACET查询 ···························································································································· 4
FIELD
FACET ····································································································································· 4
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
2.
2.1
2.2
2.3
2.4
2.5
2.6
3.
4.
5.
五.
··························································································································· 7
······························································································································ 7
····························································································································· 7
··························································································································· 8
nt ····················································································································· 8
g ························································································································ 8
······················································································································· 8
······································································································ 8
····························································································································· 8
···················································································································· 8
······················································································································ 8
······················································································································ 8
d ·············································································································· 8
··················································································································· 9
DATE
FACET ····································································································································· 8
FACET
QUERY ································································································································· 10
KEY操作符 ·································································································································· 12
TAG操作符和EX操作符 ············································································································· 14
SOLRJ对FACET的支持 ········································································································ 17
一. Facet简介
Facet是solr的高级搜索功能之一,可以给用户提供更友好的搜索体验.在搜索关键字的同时,能够按照Facet的字段进行分组并统计.
二. Facet字段
1. 适宜被Facet的字段
一般代表了实体的某种公共属性,如商品的分类,商品的制造厂家,书籍的出版商等等.
2. Facet字段的要求
Facet的字段必须被索引.一般来说该字段无需分词,无需存储.
无需分词是因为该字段的值代表了一个整体概念,如电脑的品牌”联想”代表了一个整体概念,如果拆成”联”,”想”两个字都不具有实际意义.另外该字段的值无需进行大小写转换等处理,保持其原貌即可.
无需存储是因为一般而言用户所关心的并不是该字段的具体值,而是作为对查询结果进行分组的一种手段,用户一般会沿着这个分组进一步深入搜索.
3. 特殊情况
对于一般查询而言,分词和存储都是必要的.比如CPU类型”Intel 酷睿2双核 P7570”,拆分成”Intel”,”酷睿”,”P7570”这样一些关键字并分别索引,可能提供更好的搜索体验.但是如果将CPU作为Facet字段,最好不进行分词.这样就造成了矛盾,解决方法为,将CPU字段设置为不分词不存储,然后建立另外一个字段为它的COPY,对这个COPY的字段进行分词和存储.
……
……
……
三. Facet组件
Solr的默认requestHandler(Handler)已经包含了Facet组件(omponent).如果自定义requestHandler或者对默认的requestHandler自定义组件列表,那么需要将Facet加入到组件列表中去.
……
……
四. Facet查询
进行Facet查询需要在请求参数中加入”facet=on”或者”facet=true”只有这样Facet组件才起作用.
1. Field Facet
Facet字段通过在请求中加入””参数加以声明,如果需要对多个字段进行Facet查询,那么将该参数声明多次.比如
/select?q=联想
&facet=on
&=cpu
&=videoCard
返回结果:
各个Facet字段互不影响,且可以针对每个Facet字段设置查询参数.以下介绍的参数既可以应用于所有的Facet字段,也可以应用于每个单独的Facet字段.应用于单独的字段时通过
f.字段名.参数名=参数值
这种方式调用.比如参数应用于cpu字段,可以采用如下形式
=Intel
1.1
表示Facet字段值的前缀.比如”=cpu&=Intel”,那么对cpu字段进行Facet查询,返回的cpu都是以”Intel”开头的,”AMD”开头的cpu型号将不会被统计在内.
1.2
表示Facet字段值以哪种顺序返回.可接受的值为true(count)|false(index,lex).
true(count)表示按照count值从大到小排列. false(index,lex)表示按照字段值的自然顺序(字母,数字的顺序)排列.默认情况下为true(count).当值为负数时,默认= false(index,lex).
1.3
限制Facet字段返回的结果条数.默认值为100.如果此值为负数,表示不限制.
1.4
返回结果集的偏移量,默认为0.它与配合使用可以达到分页的效果.
1.5 nt
限制了Facet字段值的最小count,默认为0.合理设置该参数可以将用户的关注点集中在少数比较热门的领域.
1.6 g
默认为””,如果设置为true或者on,那么将统计那些该Facet字段值为null的记录.
1.7
取值为enum或fc,默认为fc.该字段表示了两种Facet的算法,与执行效率相关.
enum适用于字段值比较少的情况,比如字段类型为布尔型,或者字段表示中国的所有省份.Solr会遍历该字段的所有取值,并从filterCache里为每个值分配一个filter(这里要求里对filterCache的设置足够大).然后计算每个filter与主查询的交集.
fc(表示Field Cache)适用于字段取值比较多,但在每个文档里出现次数比较少的情况.Solr会遍历所有的文档,在每个文档内搜索Cache内的值,如果找到就将Cache内该值的count加1.
1.8
当=enum时,此参数其作用,minDf表示minimum document frequency.也就是文档内出现某个关键字的最少次数.该参数默认值为0.设置该参数可以减少filterCache的内存消耗,但会增加总的查询时间(计算交集的时间增加了).如果设置该值的话,官方文档建议优先尝试25-50内的值.
2. Date Facet
日期类型的字段在文档中很常见,如商品上市时间,货物出仓时间,书籍上架时间等等.某些情况下需要针对这些字段进行Facet.不过时间字段的取值有无限性,用户往往关心的不是某个时间点而是某个时间段内的查询统计结果. Solr为日期字段提供了更为方便的查询统计方式.当然,字段的类型必须是DateField(或其子类型).
需要注意的是,使用Date Facet时,字段名,起始时间,结束时间,时间间隔这4个参数都必须提供.
与Field Facet类似,Date Facet也可以对多个字段进行Facet.并且针对每个字段都可以单独设置参数.
2.1
该参数表示需要进行Date Facet的字段名,与一样,该参数可以被设置多次,表示对多个字段进行Date Facet.
2.2
起始时间,时间的一般格式为” 1995-12-31T23:59:59Z”,另外可以使用”NOW”,”YEAR”,”MONTH”等等,具体格式可以参考.
DateField的java doc.
2.3
结束时间.
2.4
时间间隔.如果start为2009-1-1,end为设置为”+1MONTH”表示间隔1个月,那么将会把这段时间划分为12个间隔段.注意”+”因为是特殊字符所以应该用”%2B”代替.
2.5 d
取值可以为true|false,默认为false.它表示gap迭代到end处采用何种处理.举例说明start为2009-1-1,end为2009-12-25,gap为”+1MONTH”,hardend为false的话最后一个时间段为2009-12-1至2010-1-1;hardend为true的话最后一个时间段为2009-12-1至2009-12-25.
2.6
取值范围为before|after|between|none|all,默认为none.
before会对start之前的值做统计.
after会对end之后的值做统计.
between会对start至end之间所有值做统计.如果hardend为true的话,那么该值就是各个时间段统计值的和.
none表示该项禁用.
all表示before,after,all都会统计.
举例:
&facet=on
&=date
&=2009-1-1T0:0:0Z
&=2010-1-1T0:0:0Z
&=%2B1MONTH
&=all
返回结果:
3. Facet Query
Facet Query利用类似于filter query的语法提供了更为灵活的Facet.通过参数,可以对任意字段进行筛选.
例1:
&facet=on
&=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]
&=date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]
返回结果:
例2:
&facet=on
&=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]
&=price:[* TO 5000]
返回结果:
例3:
&facet=on
&=cpu:[A TO G]
返回结果:
4. key操作符
可以用key操作符为Facet字段取一个别名.
例:
&facet=on
&={!key=中央处理器}cpu
&={!key=显卡}videoCard
返回结果:
5. tag操作符和ex操作符
当查询使用filter query的时候,如果filter query的字段正好是Facet字段,那么查询结果往往被限制在某一个值内.
例:
&fq=screenSize:14
&facet=on
&=screenSize
返回结果:
可以看到,屏幕尺寸(screenSize)为14寸的产品共有107件,其它尺寸的产品的数目都是0,这是因为在filter里已经限制了screenSize:14.这样,查询结果中,除了screenSize=14的这一项之外,其它项目没有实际的意义.
有些时候,用户希望把结果限制在某一范围内,又希望查看该范围外的概况.比如上述情况,既要把查询结果限制在14寸屏的笔记本,又想查看一下其它屏幕尺寸的笔记本有多少产品.这个时候需要用到tag和ex操作符.
tag就是把一个filter标记起来,ex(exclude)是在Facet的时候把标记过的filter排除在外.
例:
&fq={!tag=aa}screenSize:14
&facet=on
&={!ex=aa}screenSize
返回结果:
这样其它屏幕尺寸的统计信息就有意义了.
五. SolrJ对Facet的支持
SolrServer server = getSolrServer();//获取SolrServer
SolrQuery query = new SolrQuery();//建立一个新的查询
ry("*:*");
et(true);//设置facet=on
etField(new String[] { "cpu", "videoCard" });//设置需要facet的字段
etLimit(10);//限制facet返回的数量
QueryResponse response = (query);
List
for (FacetField facet : facets) {
n(e());
}
n("----------------");
List
for (Count count : counts) {
}
n();
n(e() + ":" +
nt());
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690172598a310622.html
评论列表(0条)