2019独角兽企业重金招聘Python工程师标准>>>
本文内容是在官方文档给出的gettingstarted的Demo下进行的。如何启动运行官方demo"gettingstarted"可在公众号中历史文章中查看solr6.3.0的安装部署
AdminUI 中各参数及其含义
qt = query type
指定那个类型来处理查询请求,一般不用指定,默认是standard
q = query
查询字符串,必须指定,查询结果根据该参数指定的查询词被打分
fq = filter query
过滤查询,在q的基础上进行过滤,不影响打分
sort
根据查询结果的打分或者其他指明的特点进行排序。有两种排序升序(asc),降序(desc),不区分大小写。允许根据多个field排序,用逗号分隔开。
NB: 排序的field必须是索引的field,同时field对应的type不能是multiValued的
start
结果从那一条记录开始查询
rows
查询多少条记录
fl
定义返回记录的field
df
默认查找的字段。solr6.3.0默认df=_text_
通过solr的adminUI 中可以看到如下配置
在server/solr/gettingstarted/conf/managed-schema
文件最后一行有这样一行配置
默认所有的field都被copy 到_text_中。
用处:比如一个电商的搜索api调用方大部分只期望搜索产品名称则df=product_name
wt
指明返回数据格式。默认是json
indent
返回结果是否缩进。默认indent=on开启,一般调试json,php,phps,ruby输出才有必要用这个参数
debugQuery
查询结果中包含调试信息。explain info中包含每一条查询结果的信息
更多详细信息参考: http://www.solr.cc/blog/?p=1018
NB:solr官方的例子中,对price进行排序时需要修改server/solr/gettingstarted/conf/managed-schema文件中
改为
使用solr AdminUI进行查询
http://192.168.1.23:8983/solr/gettingstarted/select?df=_text_&fl=name,price,features,score&fq=manu:Belkin&indent=on&q=ipod&sort=price%20asc&wt=json
查询结果如图所示
相关性排序
solr与其他关系型数据库和NoSQL的区别之一,是solr对返回的结果进行了查询词的相关性排序,默认按照相关性降序排列。score越高,查询词和文档的相关性就越高。
以gettingstarted为例,使用不同的参数,进行如下三次查询:
1
query : iPod
fl:name,features,score
返回的结果按照score降序排列。直观的看,第一条数据,搜索词出现3次,剩余的两条数据ipod只出现了一次。
score的值不是固定不变的。它仅用于lucence内部做相关性排序使用,查询词不同,分数也不同。
每一次查询时,每一个文档会被计算出一个和查询词匹配的分数,分数越高,文档和查询词越相关。
query : iPod power
fl:name,features,score
查询结果与上次相同,但是我们注意到,打分不同
3
query : iPod power^2
fl:name,features,score
给power这个查询词设置一个2的权重(默认都是1)。这意味着,power这个词比ipod这个词重要了一倍。现在看查询结果,虽然查询来还是那3条结果,但是顺序已经发生了变化。
翻页和排序
想一想,你自己平时在淘宝上会翻到第几页,99%的人按照某个条件拍个序,然后从前几个总找一个(不过也真有一页一页往后翻的)。所以我们在做搜索时,真的不需要返回全部的结果集。
olr使用rows和start两个属性,进行分页。
在客户端发送一个查询请求给solr,solr经过一系列的处理之后,去索引库中找,将找到的结果返回给solr,solr在经过一系列的处理,返回给客户端。执行过程如下:
所以:返回的结果越多,重新组织需要的时间就越长
--排序--
在上面的图例中我们看到可以根据相关性(score)进行排序,可以根据价格进行排序。排序和分页基本上一起使用(原文用的hand in hand意境好美),因为排序顺序决定分页的结果。
如果没有指定排序,solr会根据score来进行排序。如果两个文档的打分相同,他们会根据lucene的一个内部ID来排序。这个排序的值会随着索引
的变化而变化,所以这个排序不可靠。
更多信息请关注微信公众号:金沙数据