1、摘要
Solr
是一个独立的企业级搜索应用服务器,它对外提供类似于
Web-service
的
API
接口。用户可以通过
http
请求,向搜索引擎服务器提交一定格式的
XML
文件,生成索引;也可以通过
Http Get
操作提出查找请求,并得到
XML
格式的返回结果。
在
Java
中,我们只要使用
Apache
提供的
Solrj
这个工具,导入相关包,调用其
API
就可以对
solr
进行操作了。
一般的查询只要按
solr
的语法拼写查询语句,如:
name:
张三,调用查询接口即可,下面介绍几个高级的查询接口相关使用方法。
2、创建SolrCloud的solrj server
SolrCloud是基于Solr和Zookeeper的分布式搜索方案,从Solr4.0开始包含在其中。获取非分布式solrj server 与获取分布式集群,即SolrCloud的不同,非分布式方式中获取需要用到的连接信息是solr服务的IP及端口,而在SolrCloud下需要用到的连接信息Zookeeper的IP和端口,如:
3、facet查询
Facet
查询意为面查询,是
solr
中实现分组统计的工具。比如,需要查询“手机”,并根据品牌统计出各有多少个查询结果:三星(
100
),苹果(
10
),诺基亚(
100
)。此时,就可以用到
facet
查询。
solr
有几种
facet:
A
、普通
facet
,比如上面所举例子;
B
、查询
facet
,比如根据价格查询时,将根据价格,设置多个区间,比如
0-10
,
10-20
,
20-30
等;
C
、日期
facet
,也是一种特殊的范围查询,比如按照月份进行
facet
。
Facet
接口使用方法:
这样就做成了一个简单
facet
,调用之后,它就会给你返回一个
xml
格式的内容,你可以调用
solrJ
的
API
来取得相应的内容。
4、group by
group by
,与数据库中的意义一样,也是进行分组查询,但与上面讲到的
facet
查询不同,
facet
查询与
group by
的区别在于:
facet
的查询结果主要是分组信息:有什么分组,每个分组包括多少记录;但是分组中有哪些数据是不可知道的,只有进一步搜索;
group
则类似于关系数据库的
group by
,可以用于一个或者几个字段去重、显示一个
group
的前几条记录等。
Group by
接口使用方法:
同样,调用之后,它就会给你返回一个
xml
格式的内容,你可以调用
solrJ
的
API
来取得相应的内容。
5、自定义权重排序
Solr
的查询结果中,默认以
score
值排序,
score
是
solr
中的一个系统字段,存放该查询结果的评分结果,
solr
中有一个已经十分好的评分公式,但不一定符合某些比较特殊的业务需求,此时就需要对评分过程进行干预。
当查询结果排序中需要排除频率影响,如查询:
name:
手机
电池,如果不排除频率的影响,“手机手机手机”会比“手机电池”排得更前,但这不是我们期望的结果。要排除频率的影响,可以自定义自己的评分器:
然后,修改
solr
默认的
Similarity
类。在
solr
的配置文件
schemal.xml
,最后中修改或增加:
<similarity class="com.MySolrSimilarity"/>
,设置为自定义的评分器,重启
solr
服务后,自定义的评分器就生效了。
也可以通过在查询语句中设置权重干预评分,例如:有字段
title
和
content
,查询关键字:“手机”和“电脑”,需要查询
title
和
content
包含任一关键字的结果;
title
包含“手机”权重为
100
,包含“电脑”权重为
1
,
content
包含“手机”权重为
1
,包含“电脑”权重为
100
,则查询语句可以写成:
title:
手机
^100
电脑
^1 OR content:
手机
^1
电脑
^100
具体的评分详细信息,可以通过
solr
服务的查询界面中获取,只要勾选
debugQuery
选项开启
debug
模式即可。