Solr's XML response format
status:始終為0。除非查詢發(fā)生錯(cuò)誤,將返回錯(cuò)誤碼
QTime: 查詢耗時(shí)。由于有內(nèi)部緩存,所以兩個(gè)相同的查詢的QTime是相同的,但是查詢速度更快
numFound: 總共查詢到的結(jié)果數(shù)
start:查詢返回結(jié)果集的起始數(shù)
maxScore:查詢結(jié)果中所有數(shù)據(jù)的最高得分,如果查詢請求的fl請求參數(shù)沒有指定score,那么返回結(jié)果中doc中是不會有得分字段的
返回的結(jié)果中的每一個(gè)doc對應(yīng)的就是一條查詢出來的數(shù)據(jù),一一對應(yīng)于索引中的document,數(shù)據(jù)類型使用solr中的基本數(shù)據(jù)類型呈現(xiàn),如果是多值字段,則以排序的多個(gè)字段呈現(xiàn),每個(gè)字段同樣是簡單類型。
result節(jié)點(diǎn)之后可能會有facet highlight等
Parsing the URLurl中的文本必須是utf-8編碼,
Request handlers在solrconfig.xml中配置,允許配置兩件事情1.配置默認(rèn)的參數(shù)和一些不會改變的常量。2。注冊solr查詢組件,例如faceting highlighting等
建議在實(shí)際應(yīng)用中針對每一種類型的查詢配置單獨(dú)的request handler,這樣做的好處是可以通過配置修改參數(shù),并且對于查詢統(tǒng)計(jì)提供更好的粒度
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: 默認(rèn)參數(shù)設(shè)置,請求時(shí)參數(shù)會覆蓋此值
2。appends:可以設(shè)置多次的參數(shù)。像fq,除了請求參數(shù)中指定的同時(shí)此值也會被設(shè)置。
3.invariants:此值是常量值,并且不會被覆蓋(此值用于安全目的).
4.first-components, components, last-components:注冊當(dāng)前handler可能會用到的handler。默認(rèn)情況下已經(jīng)注冊了一些組件,例如faceting highlighting等。設(shè)置first-components和last-components會分別前置或追加到這個(gè)列表中,設(shè)置 components會完全覆蓋默認(rèn)的列表設(shè)置。
Query parameters對于boolean類型的參數(shù),真值可以是true,on,yes,假值可以為false,off,no.
Search criteria related parametersq: query的簡寫,指查詢字符串,查詢語法使用defType的設(shè)定
defType:默認(rèn)是lucene,大多數(shù)情況下將會使用dismax 或edismax
dismax和edismax支持許多增強(qiáng)的功能,更少的語法限制可以防止用戶得到不希望的結(jié)果或者是不小心使用lucene語法時(shí)提示出錯(cuò)。
fq:用戶查詢時(shí)過濾條件的范圍,類似于sql中的where,此參數(shù)不會影響得分(scoring),此參數(shù)可以重復(fù)。
qt:查詢類型。就是前邊提到的request handler,一種方法就是用/aaa來命名,然后就可以在url中用aaa?....來訪問
Result pagination related parameters
start:默認(rèn)是0,返回結(jié)果集中的起始位置,如果此值大于結(jié)果集的總數(shù),那么將不會返回任何document,但是solr也不認(rèn)為這是一個(gè)錯(cuò)誤
rows:默認(rèn)是10,
Output related parameters
fl:返回的字段列表,值用,/ 或空格分格,使用*符號返回所有字段但是不包括score,要想返回此字段必須添加
sort:排序字段,例如r_name asc,score desc,默認(rèn)是score desc,也可以用function進(jìn)行排序
wt:返回的格式,在solrconfig.xml中定義,目前支持的有xml(默認(rèn)的),json,phthon,php,phps,ruby,javabin,csv,xslt,velocity.
version:不是很有用。
Diagnostic related parameters
用于開發(fā)調(diào)試,
indent:boolean值,用于使輸出更容易閱讀。
debugQuery: 如果為true,那么接下來的查詢結(jié)果會有<lst name="debug">的調(diào)試信息,其中包括轉(zhuǎn)換的查詢字符串,score的計(jì)算,以及處理faceting所耗時(shí) 間,explainOther:如果想知道為什么某個(gè)document沒有被匹配,或者得分不高,那么可以設(shè)置此值來進(jìn)行查詢,例如 id:"Release:12345",這樣debugQuery的輸出肯定會包含第一個(gè)匹配此查詢的結(jié)果。
echoHandler:如果為true,將輸出與solr request handler匹配的java 類名。
echoParams: 控制是否在response header中包含查詢參數(shù),可以用來調(diào)試url編碼過的查詢字符串,none禁用,默認(rèn)的request handler設(shè)置此屬性為explicit,可以使用all來包含所有request handler中的配置參數(shù),除了url中的。
timeAllowed:用來指定查詢的最長時(shí)間,以毫秒為單位。
Query parsers and local-params
solr中默認(rèn)的query parser是lucene,
Query syntax (the lucene query parser)
solr完整的查詢語法是實(shí)現(xiàn)的lucene query parser.
lucene不支持查詢所有文檔,solr使用*:*可以查詢所有文檔
mandatory(強(qiáng)制性)prohibited(禁止)和優(yōu)化
mandatory:+aaa:只匹配包含aaa的
prohibited: -aaa:匹配所有的,但是除了包含aaa的
optional: aaa 可選的
如果查詢語句至少有一個(gè)mandatory,那么optional就是可選的,但是他有一個(gè)很有用的功能就是文檔得分,會匹配更多的(也就是說文檔中可以包含optional也可以沒有)
如果查詢語句沒有mandatory,那么至少要匹配一個(gè)optional(也就是說文檔中必須要包含optional)。
optional也可以指定一個(gè)確定的數(shù)或百分比來進(jìn)行匹配或不匹配,這樣的話就必須用dismax的min-should-match功能。
solr4將不再使用這種方法
Boolean operators
AND OR NOT
如果沒有明確標(biāo)記為prohibited,那么AND or && 兩邊的操作會被認(rèn)為是mandatory,例如aaa AND bbb 等同于+aaa +bbb
同樣的,OR操作會被認(rèn)為是optional的 NOT等同于prohibited
Sub-queries
(aaa AND bbb) OR (cccc || ddd )
Limitations of prohibited clauses is sub-queries
lucene 不支持純粹的否定查詢,例如-Smashing -Pumpkins。solr對lucene進(jìn)行增強(qiáng)來支持這種查詢,但是僅僅只能在頂層查詢,看下面這個(gè)例子 Smashing (-Pumpkins),這個(gè)查詢是在問:那個(gè)document包含Smashing或者不包含pumpkins嗎?無論怎樣,這樣寫都不會有正確結(jié)果 的。正確的寫法應(yīng)該是讓子表達(dá)式只包含否定語句,并且添加查詢所有的查詢“*:*"就像這樣Smashing (-Pumpkins *:*),這個(gè)限制只能應(yīng)用在edismax查詢中。
Field qualifier
member_name:aaa
+member_name:aaa +member_name:bbb 也可以用簡寫形式+member_name:(+aaa +bbb),圓括號代表的是子查詢,這個(gè)查詢的目標(biāo)字段都是同一個(gè)。
Wildcard queries
要注意的幾點(diǎn)
1. 不要對包含通配符的查詢字符串應(yīng)用文本分析,甚至是小寫,假如你想查找Sma開頭的單詞,并且索引中的字段類型包含小寫,那么就應(yīng)該使用sma*而不能用 Sma*。這是SOLR-219中的一個(gè)缺點(diǎn)。此外,假如你要使用的字段是應(yīng)用了文本分析的,那么smashing*是不會匹配到Smashing的,因 為文本分析會把Smash轉(zhuǎn)換為smash,因此,不要應(yīng)用文本分析。
2.通配符查詢是很慢的,使用ReversedWildcardFilterFactory可以提高很多,最壞的情況是在單詞兩端應(yīng)用*號。
3.起始通配符應(yīng)用*號的話結(jié)果會返回錯(cuò)誤,除非使用ReversedWildcardFilterFactory。
例子:sma* ,sma*ing, sma??*(至少后邊跟兩個(gè)或者更多)
每一個(gè)匹配項(xiàng)都會得到相同的score,不管他使用那種查詢模式。lucene以犧牲性能來支持多種score,不過得進(jìn)行一些設(shè)置讓solr來完成
有一個(gè)問題只是一個(gè)*號會怎么樣呢?結(jié)果取決于schema文件中是否有任何一個(gè)字段類型,即使索引鏈中沒有應(yīng)用一個(gè)ReversedWildcardFilterFactory,*號都會應(yīng)用所有field,如果不是這樣,那么會得到一個(gè)”不支持前導(dǎo)通配符“的錯(cuò)誤。
Fuzzy queries
例子: Smashing~
波浪號用于模糊查詢,可以通過修改相似度(0-1,默認(rèn)0.5)來進(jìn)行查詢?nèi)纾篠mashing~0.7
就像使用通配符查詢一樣,如果要使用模糊查詢就應(yīng)該將查詢字符串轉(zhuǎn)為小寫。
Range queries
例如:a_type:2 AND a_begin_date:[1990-01-01T00:00:00.000Z TO 1999-02-02T22:59:59.999Z]
"[]"包含兩端的值,”{}“不包含兩端的值,solr3中,要么都包含,要么都不包含。solr4兩個(gè)都允許。
也可以使用a_duration:[3000 TO *] 此處"*"號的方式lucene是不支持的
范圍查詢也可用于文本字段(不常用),此時(shí)所應(yīng)用的索引字段只能有一個(gè)term 例如:somefield:([B TO C] -C)
Date math
solr 擴(kuò)展了lucene原始的查詢轉(zhuǎn)換器,使date應(yīng)用范圍查詢時(shí)再加方便,就像數(shù)字計(jì)算一樣。另外還可以通過”NOW“(精確到毫秒級)來獲取當(dāng)前時(shí)間, 其語法還提供了補(bǔ)充,如減法,四舍五入根據(jù)不同的粒度,如年,秒等。操作可以鏈接到一起,并且從左向右執(zhí)行,不允許有空格。例
r_event_date:[* TO NOW-2YEAR]
因?yàn)镹OW是精確到毫秒級的,所以如果只是想到天的話可以用”/"向下舍入(此符號只會向下舍入)
r_event_date:[* To NOW/DAY-2YEAR]
可選的單位有YEAR,MONTH,DAY,DATE(與DAY相同),HOUR,MINUTE,SECOND,MILISECOND,MILIT(與MILISECOND相同)
DateMath 不只是用于查詢,同樣用于索引,用于索引時(shí)應(yīng)該使用正確的精度,否則精確到毫秒級的話不僅占用更多的磁盤空間,而且也會降低查詢速度,常用的索引日期字段 是這樣的<field name="indexedAt" type="tdate" default="NOW/SECOND" />
Score boosting
通過添加乘數(shù)可以修改查詢字符串中的條文貢獻(xiàn)給最終得分的程度,這叫做增強(qiáng),0到1之間的值減少得分,大于1的值增加得分,
例:a_member_name:Billy^2 OR Smashing 或者 +Billy Bob Corgan^0.7
Existence (and non-existence) queries
如果要查詢某個(gè)字段下的所有文檔可以這樣a_name:[* TO * ]
也可以查詢某個(gè)字段下沒有值的所有文檔,-a_name:[* TO *]
Escaping special characters
+ - && || ! () {} [] ^ '' ~ * ? : \ 要想使用這些字符的原意可以用"\" 例id:artist\:aaa 通過雙引號也可以實(shí)現(xiàn)同樣效果id:"artist:aaa"
如果使用solrj與solr交互,可以使用ClientUtils.escapeQueryChars()進(jìn)行轉(zhuǎn)義
The Dismax query parser
dismax 是lucene的DisjunctionMaxQuery之后的名字,這個(gè)query parser對于scoring 有直接關(guān)系.
edismax中的e是extended的意思,這個(gè)parser是在solr3.1中增加的,他由dismax的演化而來。
Searching multiple fields
<str name="qf">a_name a_alias^0.7 a_member_name^0.4</str>如果想根據(jù)scoring排序,可以將scoring設(shè)大一點(diǎn),這樣就會排在最上邊
關(guān) 于schema中定義的stop words的效果,如果qf指定的字段中其中一些字段使用stop words而別一些沒有使用,那么查詢stop words將不會返回任何結(jié)果。edismax把查詢字符串中的stop words認(rèn)為都是可選的(也就是可有可無),除非查詢字符串中全部使用stop words,使用dismax 你可以確保查詢字段中的查詢分板鏈過濾出相同的stop words值。
Limited query syntax
edismax首先會把用戶的查詢使用lucene支持的所有語法進(jìn)行轉(zhuǎn)換,進(jìn)行兩次調(diào)整,如果轉(zhuǎn)換失敗,它接下來會跳到原始的dismax的語法規(guī)則。
or和and還有布爾運(yùn)算可以用小寫形式,并且支持純否定子查詢。
如果使用dismax,對于terms,phrase它都會限制可以使用的語法,并且使用+和-(而不是AND,OR,&&,||)來對條文應(yīng)用強(qiáng)制應(yīng)用和禁止應(yīng)用。
還有就是是否需要對相關(guān)查詢的有效性進(jìn)行轉(zhuǎn)義。為了不觸發(fā)錯(cuò)誤,除非使用edismax否則就必須編碼來處理某些突出的問題。
Min-should-match
lucene query parser有兩種操作,一是默認(rèn)操作是or,也就是說只要有一個(gè)條文匹配就可以,另一個(gè)就是使用AND來使所有條文匹配。它不能使用+或-進(jìn)行明確指 定。這是兩種極端的情況。dismax有一個(gè)方法叫min-should-mathc,它用來指定多少條文必須匹配,或者有多少個(gè)是禁止的。這個(gè)值可以設(shè) 置為百分比或確定的數(shù)值。在配置文件中可以通過查詢參數(shù)“mm"來設(shè)置。語法也比較簡單。
Basic rules
mm參數(shù)的四個(gè)基本語法如下:
1:3 必須匹配3個(gè)條文,其余的是可選的。
2:-2 2個(gè)條文是可選的,其余的是必須的。
3:66% 66%的條文是必須的,其余的是可選的。
4:-25% 25%的條文是可選的,其余的是必須的。
注 意:-是對必須的除以可選的的逆向取值,它在這兒的定義其實(shí)沒有否定多少的意思。雖然75%和-25%看起來一樣,但是在rounding的時(shí)候就不一樣 了,例如有五個(gè)查詢條文,第一個(gè)條文需要三次,第二個(gè)條文需要四次,這也就說明如果要進(jìn)行rounding計(jì)算,那么就需要反轉(zhuǎn)標(biāo)志再用100減去此值。
另外兩點(diǎn):1.如果mm的值是一個(gè)確定的值n,但是查詢的條文數(shù)小于此值,那么n會減少到查詢結(jié)果中的條文總數(shù)。例如mm值為-5但是查詢中的條文一共只有2個(gè),所以結(jié)果就是所有條文都是可選的。
2.記住一點(diǎn),不管是lucene還是solr,在所有查詢中,必須有一個(gè)條文是匹配的,即使所有條文都是可選的,
Multiple rules
是 以空格分隔的一個(gè)串,例如number<basicmm ,意思是說如果條文的數(shù)量大于number, 那么就應(yīng)用basicmm規(guī)則。(規(guī)則的從左向右升序排列的)。只有最右端的規(guī)則才會被計(jì)算,執(zhí)行的規(guī)則肯定是滿足最大的條文總數(shù)。如果不滿足任何一個(gè)規(guī) 則,那么所有條文都是必須的。例如:
2<75% 9<-3 這個(gè)規(guī)則的意思是說,如果條文總數(shù)大于9,那么其中3個(gè)是可選的,其它的都是必須的。如果條文總數(shù)大于2,那么75%是必須的。其它情況(也就是條文總數(shù)只有1個(gè)或2個(gè))那么所有條文都是必須的(這是默認(rèn))。
What to choose
Min-should-match的簡單配置是使所有terms都是可選的。它的效果相當(dāng)于默認(rèn)的Lucene query parser 的OR操作,默認(rèn)是0%。反過來的另一種極端就是所有terms都是必須的,這個(gè)就相當(dāng)于AND操作,就像100%。
注 意:你可能想讓所有terms都匹配,實(shí)事上這也是默認(rèn)設(shè)置。但是如果有一個(gè)term沒有找到,那么不會返回任何結(jié)果。當(dāng)你設(shè)置一些terms是可選的時(shí) 候,匹配的結(jié)果會以score排序,包含最多terms的結(jié)果會排在頂部。還有一方法就是在沒有返回結(jié)果的時(shí)候進(jìn)行二次查詢,但是solr是不支持的,不 過可以通過客戶端很容易的實(shí)現(xiàn)。
A default search
dismax 查詢支持一個(gè)默認(rèn)查詢。也就是用戶沒有指定q的時(shí)候。參數(shù)是q.alt。例如<str name="q.alt">*:*</str>。這個(gè)參數(shù)通常設(shè)置在solrconfig.xml文件的request handler中來查詢所有文檔。在faceting中會使用到這個(gè)設(shè)置。如果不想返回任何結(jié)果可以設(shè)置為-*:*;
Filtering
filter查詢不會影響scoring,不像用戶查詢。要添加一個(gè)filter,只要使用fq參數(shù)。使用filter可以改進(jìn)執(zhí)行效率,因?yàn)槊恳粋€(gè)filter查詢都會緩存在solr的filter cache中并且執(zhí)行速度相當(dāng)快。
solr 3.4通過本地參數(shù)cache來控制是否啟用緩存
Sorting
使用sort參數(shù),默認(rèn)是score desc。例:sort=a_type desc,score desc
進(jìn)行排序字段的數(shù)值類型必須是single valued,indexed,并且是not-tokenized。
另外solr還支持function query ,它通常用來計(jì)算空間地理位置的距離,或現(xiàn)在與字段值的時(shí)間差等。例sort=sub(begin_time,end_time) desc