Solr's XML response format
status:始终为0。除非查询发生错误,将返回错误码
QTime: 查询耗时。由于有内部缓存,所以两个相同的查询的QTime是相同的,但是查询速度更快
numFound: 总共查询到的结果数
start:查询返回结果集的起始数
maxScore:查询结果中所有数据的最高得分,如果查询请求的fl请求参数没有指定score,那么返回结果中doc中是不会有得分字段的
返回的结果中的每一个doc对应的就是一条查询出来的数据,一一对应于索引中的document,数据类型使用solr中的基本数据类型呈现,如果是多值字段,则以排序的多个字段呈现,每个字段同样是简单类型。
result节点之后可能会有facet highlight等
Parsing the URLurl中的文本必须是utf-8编码,
Request handlers在solrconfig.xml中配置,允许配置两件事情1.配置默认的参数和一些不会改变的常量。2。注册solr查询组件,例如faceting highlighting等
建议在实际应用中针对每一种类型的查询配置单独的request handler,这样做的好处是可以通过配置修改参数,并且对于查询统计提供更好的粒度
qt="handler name";
<requestHandler name="bands" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">none</str>
<int name="rows">20</int>
</lst>
<lst name="appends">
<str name="fq">a_type:group</str>
</lst>
<lst name="invariants">
<str name="facet">false</str>
</lst>
</requestHandler>
1。defaults: 默认参数设置,请求时参数会覆盖此值
2。appends:可以设置多次的参数。像fq,除了请求参数中指定的同时此值也会被设置。
3.invariants:此值是常量值,并且不会被覆盖(此值用于安全目的).
4.first-components, components, last-components:注册当前handler可能会用到的handler。默认情况下已经注册了一些组件,例如faceting highlighting等。设置first-components和last-components会分别前置或追加到这个列表中,设置 components会完全覆盖默认的列表设置。
Query parameters对于boolean类型的参数,真值可以是true,on,yes,假值可以为false,off,no.
Search criteria related parametersq: query的简写,指查询字符串,查询语法使用defType的设定
defType:默认是lucene,大多数情况下将会使用dismax 或edismax
dismax和edismax支持许多增强的功能,更少的语法限制可以防止用户得到不希望的结果或者是不小心使用lucene语法时提示出错。
fq:用户查询时过滤条件的范围,类似于sql中的where,此参数不会影响得分(scoring),此参数可以重复。
qt:查询类型。就是前边提到的request handler,一种方法就是用/aaa来命名,然后就可以在url中用aaa?....来访问
Result pagination related parameters
start:默认是0,返回结果集中的起始位置,如果此值大于结果集的总数,那么将不会返回任何document,但是solr也不认为这是一个错误
rows:默认是10,
Output related parameters
fl:返回的字段列表,值用,/ 或空格分格,使用*符号返回所有字段但是不包括score,要想返回此字段必须添加
sort:排序字段,例如r_name asc,score desc,默认是score desc,也可以用function进行排序
wt:返回的格式,在solrconfig.xml中定义,目前支持的有xml(默认的),json,phthon,php,phps,ruby,javabin,csv,xslt,velocity.
version:不是很有用。
Diagnostic related parameters
用于开发调试,
indent:boolean值,用于使输出更容易阅读。
debugQuery: 如果为true,那么接下来的查询结果会有<lst name="debug">的调试信息,其中包括转换的查询字符串,score的计算,以及处理faceting所耗时 间,explainOther:如果想知道为什么某个document没有被匹配,或者得分不高,那么可以设置此值来进行查询,例如 id:"Release:12345",这样debugQuery的输出肯定会包含第一个匹配此查询的结果。
echoHandler:如果为true,将输出与solr request handler匹配的java 类名。
echoParams: 控制是否在response header中包含查询参数,可以用来调试url编码过的查询字符串,none禁用,默认的request handler设置此属性为explicit,可以使用all来包含所有request handler中的配置参数,除了url中的。
timeAllowed:用来指定查询的最长时间,以毫秒为单位。
Query parsers and local-params
solr中默认的query parser是lucene,
Query syntax (the lucene query parser)
solr完整的查询语法是实现的lucene query parser.
lucene不支持查询所有文档,solr使用*:*可以查询所有文档
mandatory(强制性)prohibited(禁止)和优化
mandatory:+aaa:只匹配包含aaa的
prohibited: -aaa:匹配所有的,但是除了包含aaa的
optional: aaa 可选的
如果查询语句至少有一个mandatory,那么optional就是可选的,但是他有一个很有用的功能就是文档得分,会匹配更多的(也就是说文档中可以包含optional也可以没有)
如果查询语句没有mandatory,那么至少要匹配一个optional(也就是说文档中必须要包含optional)。
optional也可以指定一个确定的数或百分比来进行匹配或不匹配,这样的话就必须用dismax的min-should-match功能。
solr4将不再使用这种方法
Boolean operators
AND OR NOT
如果没有明确标记为prohibited,那么AND or && 两边的操作会被认为是mandatory,例如aaa AND bbb 等同于+aaa +bbb
同样的,OR操作会被认为是optional的 NOT等同于prohibited
Sub-queries
(aaa AND bbb) OR (cccc || ddd )
Limitations of prohibited clauses is sub-queries
lucene 不支持纯粹的否定查询,例如-Smashing -Pumpkins。solr对lucene进行增强来支持这种查询,但是仅仅只能在顶层查询,看下面这个例子 Smashing (-Pumpkins),这个查询是在问:那个document包含Smashing或者不包含pumpkins吗?无论怎样,这样写都不会有正确结果 的。正确的写法应该是让子表达式只包含否定语句,并且添加查询所有的查询“*:*"就像这样Smashing (-Pumpkins *:*),这个限制只能应用在edismax查询中。
Field qualifier
member_name:aaa
+member_name:aaa +member_name:bbb 也可以用简写形式+member_name:(+aaa +bbb),圆括号代表的是子查询,这个查询的目标字段都是同一个。
Wildcard queries
要注意的几点
1. 不要对包含通配符的查询字符串应用文本分析,甚至是小写,假如你想查找Sma开头的单词,并且索引中的字段类型包含小写,那么就应该使用sma*而不能用 Sma*。这是SOLR-219中的一个缺点。此外,假如你要使用的字段是应用了文本分析的,那么smashing*是不会匹配到Smashing的,因 为文本分析会把Smash转换为smash,因此,不要应用文本分析。
2.通配符查询是很慢的,使用ReversedWildcardFilterFactory可以提高很多,最坏的情况是在单词两端应用*号。
3.起始通配符应用*号的话结果会返回错误,除非使用ReversedWildcardFilterFactory。
例子:sma* ,sma*ing, sma??*(至少后边跟两个或者更多)
每一个匹配项都会得到相同的score,不管他使用那种查询模式。lucene以牺牲性能来支持多种score,不过得进行一些设置让solr来完成
有一个问题只是一个*号会怎么样呢?结果取决于schema文件中是否有任何一个字段类型,即使索引链中没有应用一个ReversedWildcardFilterFactory,*号都会应用所有field,如果不是这样,那么会得到一个”不支持前导通配符“的错误。
Fuzzy queries
例子: Smashing~
波浪号用于模糊查询,可以通过修改相似度(0-1,默认0.5)来进行查询如:Smashing~0.7
就像使用通配符查询一样,如果要使用模糊查询就应该将查询字符串转为小写。
Range queries
例如:a_type:2 AND a_begin_date:[1990-01-01T00:00:00.000Z TO 1999-02-02T22:59:59.999Z]
"[]"包含两端的值,”{}“不包含两端的值,solr3中,要么都包含,要么都不包含。solr4两个都允许。
也可以使用a_duration:[3000 TO *] 此处"*"号的方式lucene是不支持的
范围查询也可用于文本字段(不常用),此时所应用的索引字段只能有一个term 例如:somefield:([B TO C] -C)
Date math
solr 扩展了lucene原始的查询转换器,使date应用范围查询时再加方便,就像数字计算一样。另外还可以通过”NOW“(精确到毫秒级)来获取当前时间, 其语法还提供了补充,如减法,四舍五入根据不同的粒度,如年,秒等。操作可以链接到一起,并且从左向右执行,不允许有空格。例
r_event_date:[* TO NOW-2YEAR]
因为NOW是精确到毫秒级的,所以如果只是想到天的话可以用”/"向下舍入(此符号只会向下舍入)
r_event_date:[* To NOW/DAY-2YEAR]
可选的单位有YEAR,MONTH,DAY,DATE(与DAY相同),HOUR,MINUTE,SECOND,MILISECOND,MILIT(与MILISECOND相同)
DateMath 不只是用于查询,同样用于索引,用于索引时应该使用正确的精度,否则精确到毫秒级的话不仅占用更多的磁盘空间,而且也会降低查询速度,常用的索引日期字段 是这样的<field name="indexedAt" type="tdate" default="NOW/SECOND" />
Score boosting
通过添加乘数可以修改查询字符串中的条文贡献给最终得分的程度,这叫做增强,0到1之间的值减少得分,大于1的值增加得分,
例:a_member_name:Billy^2 OR Smashing 或者 +Billy Bob Corgan^0.7
Existence (and non-existence) queries
如果要查询某个字段下的所有文档可以这样a_name:[* TO * ]
也可以查询某个字段下没有值的所有文档,-a_name:[* TO *]
Escaping special characters
+ - && || ! () {} [] ^ '' ~ * ? : \ 要想使用这些字符的原意可以用"\" 例id:artist\:aaa 通过双引号也可以实现同样效果id:"artist:aaa"
如果使用solrj与solr交互,可以使用ClientUtils.escapeQueryChars()进行转义
The Dismax query parser
dismax 是lucene的DisjunctionMaxQuery之后的名字,这个query parser对于scoring 有直接关系.
edismax中的e是extended的意思,这个parser是在solr3.1中增加的,他由dismax的演化而来。
Searching multiple fields
<str name="qf">a_name a_alias^0.7 a_member_name^0.4</str>如果想根据scoring排序,可以将scoring设大一点,这样就会排在最上边
关 于schema中定义的stop words的效果,如果qf指定的字段中其中一些字段使用stop words而别一些没有使用,那么查询stop words将不会返回任何结果。edismax把查询字符串中的stop words认为都是可选的(也就是可有可无),除非查询字符串中全部使用stop words,使用dismax 你可以确保查询字段中的查询分板链过滤出相同的stop words值。
Limited query syntax
edismax首先会把用户的查询使用lucene支持的所有语法进行转换,进行两次调整,如果转换失败,它接下来会跳到原始的dismax的语法规则。
or和and还有布尔运算可以用小写形式,并且支持纯否定子查询。
如果使用dismax,对于terms,phrase它都会限制可以使用的语法,并且使用+和-(而不是AND,OR,&&,||)来对条文应用强制应用和禁止应用。
还有就是是否需要对相关查询的有效性进行转义。为了不触发错误,除非使用edismax否则就必须编码来处理某些突出的问题。
Min-should-match
lucene query parser有两种操作,一是默认操作是or,也就是说只要有一个条文匹配就可以,另一个就是使用AND来使所有条文匹配。它不能使用+或-进行明确指 定。这是两种极端的情况。dismax有一个方法叫min-should-mathc,它用来指定多少条文必须匹配,或者有多少个是禁止的。这个值可以设 置为百分比或确定的数值。在配置文件中可以通过查询参数“mm"来设置。语法也比较简单。
Basic rules
mm参数的四个基本语法如下:
1:3 必须匹配3个条文,其余的是可选的。
2:-2 2个条文是可选的,其余的是必须的。
3:66% 66%的条文是必须的,其余的是可选的。
4:-25% 25%的条文是可选的,其余的是必须的。
注 意:-是对必须的除以可选的的逆向取值,它在这儿的定义其实没有否定多少的意思。虽然75%和-25%看起来一样,但是在rounding的时候就不一样 了,例如有五个查询条文,第一个条文需要三次,第二个条文需要四次,这也就说明如果要进行rounding计算,那么就需要反转标志再用100减去此值。
另外两点:1.如果mm的值是一个确定的值n,但是查询的条文数小于此值,那么n会减少到查询结果中的条文总数。例如mm值为-5但是查询中的条文一共只有2个,所以结果就是所有条文都是可选的。
2.记住一点,不管是lucene还是solr,在所有查询中,必须有一个条文是匹配的,即使所有条文都是可选的,
Multiple rules
是 以空格分隔的一个串,例如number<basicmm ,意思是说如果条文的数量大于number, 那么就应用basicmm规则。(规则的从左向右升序排列的)。只有最右端的规则才会被计算,执行的规则肯定是满足最大的条文总数。如果不满足任何一个规 则,那么所有条文都是必须的。例如:
2<75% 9<-3 这个规则的意思是说,如果条文总数大于9,那么其中3个是可选的,其它的都是必须的。如果条文总数大于2,那么75%是必须的。其它情况(也就是条文总数只有1个或2个)那么所有条文都是必须的(这是默认)。
What to choose
Min-should-match的简单配置是使所有terms都是可选的。它的效果相当于默认的Lucene query parser 的OR操作,默认是0%。反过来的另一种极端就是所有terms都是必须的,这个就相当于AND操作,就像100%。
注 意:你可能想让所有terms都匹配,实事上这也是默认设置。但是如果有一个term没有找到,那么不会返回任何结果。当你设置一些terms是可选的时 候,匹配的结果会以score排序,包含最多terms的结果会排在顶部。还有一方法就是在没有返回结果的时候进行二次查询,但是solr是不支持的,不 过可以通过客户端很容易的实现。
A default search
dismax 查询支持一个默认查询。也就是用户没有指定q的时候。参数是q.alt。例如<str name="q.alt">*:*</str>。这个参数通常设置在solrconfig.xml文件的request handler中来查询所有文档。在faceting中会使用到这个设置。如果不想返回任何结果可以设置为-*:*;
Filtering
filter查询不会影响scoring,不像用户查询。要添加一个filter,只要使用fq参数。使用filter可以改进执行效率,因为每一个filter查询都会缓存在solr的filter cache中并且执行速度相当快。
solr 3.4通过本地参数cache来控制是否启用缓存
Sorting
使用sort参数,默认是score desc。例:sort=a_type desc,score desc
进行排序字段的数值类型必须是single valued,indexed,并且是not-tokenized。
另外solr还支持function query ,它通常用来计算空间地理位置的距离,或现在与字段值的时间差等。例sort=sub(begin_time,end_time) desc