一.基本查詢php
q – 查詢字符串,必須的。
fl – 指定返回那些字段內容,用逗號或空格分隔多個。
start – 返回第一條記錄在完整找到結果中的偏移位置,0開始,通常分頁用。
rows – 指定返回結果最多有多少條記錄,配合start來實現分頁。
sort – 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 「inStock」 降序, 再 「price」 升序,默認是相關性降序。
wt – (writer type)指定輸出格式,能夠有 xml, json, php, phps, 後面 solr 1.3增長的,要用通知咱們,由於默認沒有打開。
fq – (filter query)過慮查詢,做用:在q查詢符合結果中同時是fq查詢符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找關鍵字mm,而且date_time是20081001到20091031之間的。java
q.op – 覆蓋schema.xml的defaultOperator(有空格時用」AND」仍是用」OR」操做邏輯),通常默認指定
df – 默認的查詢字段,通常默認指定
qt – (query type)指定那個類型來處理查詢請求,通常不用指定,默認是standard。正則表達式
- 排除在要排除的詞前加上 「-」 (不包含」號) 號
其它
indent – 返回的結果是否縮進,默認關閉,用 indent=true|on 開啓,通常調試json,php,phps,ruby輸出纔有必要用這個參數。
version – 查詢語法的版本,建議不使用它,由服務器指定默認值。
[Solr的檢索運算符]
「:」 指定字段查指定值,如返回全部值*:*²
「?」²表示單個任意字符的通配
「*」 表示多個任意字符的通配(不能在檢索的項開始使用*或者?符號)²
「~」²表示模糊檢索,如檢索拼寫相似於」roam」的項這樣寫:roam~將找到形如foam和roams的單詞;roam~0.8,檢索返回類似度在0.8以上的記錄。
²鄰近檢索,如檢索相隔10個單詞的」apache」和」jakarta」,」jakarta apache」~10
「^」²控制相關度檢索,如檢索jakarta apache,同時但願去讓」jakarta」的相關度更加好,那麼在其後加上」^」符號和增量值,即jakarta^4 apache
布爾操做符AND、||²
布爾操做符OR、²&&
布爾操做符NOT、!、-²(排除操做符不能單獨與項使用構成查詢)
「+」 存在操做符,要求符號」+」後的項必須在文檔相應的域中存在²
( ) 用於構成子查詢²
² [] 包含範圍檢索,如檢索某時間段記錄,包含頭尾,date:[200707 TO 200710]
{}²不包含範圍檢索,如檢索某時間段記錄,不包含頭尾
date:{200707 TO 200710}
」 轉義操做符,特殊字符包括+ – & | ! ( ) { } [ ] ^ 」 ~ * ? : 「算法
二.高亮
hl-highlight,h1=true,表示採用高亮。能夠用h1.fl=field1,field2 來設定高亮顯示的字段。apache
hl.fl: 用空格或逗號隔開的字段列表。要啓用某個字段的highlight功能,就得保證該字段在schema中是stored。若是該參數未被給出,那麼就會高 亮默認字段 standard handler會用df參數,dismax字段用qf參數。你可使用星號去方便的高亮全部字段。若是你使用了通配符,那麼要考慮啓用 hl.requiredFieldMatch選項。json
hl.requireFieldMatch:
若是置爲true,除非該字段的查詢結果不爲空纔會被高亮。它的默認值是false,意味 着它可能匹配某個字段卻高亮一個不一樣的字段。若是hl.fl使用了通配符,那麼就要啓用該參數。儘管如此,若是你的查詢是all字段(多是使用 copy-field 指令),那麼仍是把它設爲false,這樣搜索結果能代表哪一個字段的查詢文本未被找到ruby
hl.usePhraseHighlighter:
若是一個查詢中含有短語(引號框起來的)那麼會保證必定要徹底匹配短語的纔會被高亮。服務器
hl.highlightMultiTerm
若是使用通配符和模糊搜索,那麼會確保與通配符匹配的term會高亮。默認爲false,同時hl.usePhraseHighlighter要爲true。ide
hl.snippets:
這是highlighted片斷的最大數。默認值爲1,也幾乎不會修改。若是某個特定的字段的該值被置爲0(如f.allText.hl.snippets=0),這就代表該字段被禁用高亮了。你可能在hl.fl=*時會這麼用。ui
hl.fragsize:
每一個snippet返回的最大字符數。默認是100.若是爲0,那麼該字段不會被fragmented且整個字段的值會被返回。大字段時不會這麼作。
hl.mergeContiguous:
若是被置爲true,當snippet重疊時會merge起來。
hl.maxAnalyzedChars:
會搜索高亮的最大字符,默認值爲51200,若是你想禁用,設爲-1
hl.alternateField:
若是沒有生成snippet(沒有terms 匹配),那麼使用另外一個字段值做爲返回。
hl.maxAlternateFieldLength:
若是hl.alternateField啓用,則有時須要制定alternateField的最大字符長度,默認0是即沒有限制。因此合理的值是應該爲
hl.snippets * hl.fragsize這樣返回結果的大小就能保持一致。
hl.formatter:一個提供可替換的formatting算法的擴展點。默認值是simple,這是目前僅有的選項。
顯然這不夠用,你能夠看看org.apache.solr.highlight.HtmlFormatter.java 和 solrconfig.xml中highlighting元素是如何配置的。
注意在不論原文中被高亮了什麼值的狀況下,如預先已存在的em tags,也不會被轉義,因此在有時會致使假的高亮。
hl.fragmenter:
這個是solr制 定fragment算法的擴展點。gap是默認值。regex是另外一種選項,這種選項指明highlight的邊界由一個正則表達式肯定。這是一種非典型 的高級選項。爲了知道默認設置和fragmenters (and formatters)是如何配置的,能夠看看solrconfig.xml中的highlight段。
regex 的fragmenter有以下選項:
hl.regex.pattern:正則表達式的pattern
hl.regex.slop:這是hl.fragsize能變化以適應正則表達式的因子。默認值是0.6,意思是若是hl.fragsize=100那麼fragment的大小會從40-160.
三.分組查詢:
1. Field Facet
Facet 字段經過在請求中加入 」facet.field」 參數加以聲明 , 若是須要對多個字段進行 Facet查詢 , 那麼將該參數聲明屢次 . 好比
/select?q=聯想
&facet=on
&facet.field=cpu
&facet.field=videoCard
各個 Facet 字段互不影響 , 且能夠針對每一個 Facet 字段設置查詢參數 . 如下介紹的參數既能夠應用於全部的 Facet 字段 , 也能夠應用於每一個單獨的 Facet 字段 . 應用於單獨的字段時經過
f.字段名.參數名=參數值
這種方式調用 .
好比 facet.prefix 參數應用於 cpu 字段 , 能夠採用以下形式 f.cpu.facet.prefix=Intel
1.1 facet.prefix
表示 Facet 字段值的前綴 . 好比 」facet.field=cpu&facet.prefix=Intel」, 那麼對 cpu字段進行 Facet 查詢 , 返回的 cpu 都是以 」Intel」 開頭的 ,」AMD」 開頭的 cpu 型號將不會被統計在內 .
1.2 facet.sort
表示 Facet 字段值以哪一種順序返回 . 可接受的值爲 true(count)|false(index,lex). true(count) 表示按照 count 值從大到小排列 . false(index,lex) 表示按照字段值的天然順序 (字母 , 數字的順序 ) 排列 . 默認狀況下爲 true(count). 當 facet.limit 值爲負數時 ,默認 facet.sort= false(index,lex).
1.3 facet.limit
限制 Facet 字段返回的結果條數 . 默認值爲 100. 若是此值爲負數 , 表示不限制 .
1.4 facet.offset
返回結果集的偏移量 , 默認爲 0. 它與 facet.limit 配合使用能夠達到分頁的效果 .
1.5 facet.mincount
限制了 Facet 字段值的最小 count, 默認爲 0. 合理設置該參數能夠將用戶的關注點集中在少數比較熱門的領域 .
1.6 facet.missing
默認爲 」」, 若是設置爲 true 或者 on, 那麼將統計那些該 Facet 字段值爲 null 的記錄.
1.7 facet.method
取值爲 enum 或 fc, 默認爲 fc. 該字段表示了兩種 Facet 的算法 , 與執行效率相關 .
enum 適用於字段值比較少的狀況 , 好比字段類型爲布爾型 , 或者字段表示中國的全部省份.Solr 會遍歷該字段的全部取值 , 並從 filterCache 裏爲每一個值分配一個 filter( 這裏要求 solrconfig.xml 裏對 filterCache 的設置足夠大 ). 而後計算每一個 filter 與主查詢的交集 .
fc( 表示 Field Cache) 適用於字段取值比較多 , 但在每一個文檔裏出現次數比較少的狀況 .Solr 會遍歷全部的文檔 , 在每一個文檔內搜索 Cache 內的值 , 若是找到就將 Cache 內該值的count 加 1.
1.8 facet.enum.cache.minDf
當 facet.method=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 facet.date
該參數表示須要進行 Date Facet 的字段名 , 與 facet.field 同樣 , 該參數能夠被設置屢次 , 表示對多個字段進行 Date Facet.
2.2 facet.date.start
起始時間 , 時間的通常格式爲 」 1995-12-31T23:59:59Z」, 另外可使用 」NOW」,」YEAR」,」MONTH」 等等 , 具體格式能夠參考 org.apache.solr.schema. DateField 的 java doc.
2.3 facet.date.end
結束時間 .
2.4 facet.date.gap
時間間隔 . 若是 start 爲 2009-1-1,end 爲 2010-1-1.gap 設置爲 」+1MONTH」 表示間隔1 個月 , 那麼將會把這段時間劃分爲 12 個間隔段 . 注意 」+」 由於是特殊字符因此應該用 」%2B」 代替 .
2.5 facet.date.hardend
取值能夠爲 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 facet.date.other
取值範圍爲 before|after|between|none|all, 默認爲 none.
before 會對 start 以前的值作統計 .
after 會對 end 以後的值作統計 .
between 會對 start 至 end 之間全部值作統計 . 若是 hardend 爲 true 的話 , 那麼該值就是各個時間段統計值的和 .
none 表示該項禁用 .
all 表示 before,after,all 都會統計 .
舉例 :
&facet=on
&facet.date=date
&facet.date.start=2009-1-1T0:0:0Z
&facet.date.end=2010-1-1T0:0:0Z
&facet.date.gap=%2B1MONTH
&facet.date.other=all
返回結果
<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields"/>
<lst name="facet_dates">
<int name="2009-01-01T00:00:00Z">5</int>
<int name="2009-11-01T00:00:00Z">1</int>
<int name="2009-12-01T00:00:00Z">5</int>
<str name="gap">+1MONTH</str>
<date name="end">2010-01-01T00:00:00Z</date>
<int name="before">180</int>
<int name="after">5</int>
<int name="between">54</int>
</lst>
</lst>
3. Facet Query
Facet Query 利用相似於 filter query 的語法提供了更爲靈活的 Facet. 經過 facet.query 參數 , 能夠對任意字段進行篩選 .
例 1:
&facet=on
&facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]
&facet.query=date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]
例2:
&facet=on
&facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]
&facet.query=price:[* TO 5000]
4. key 操做符
能夠用 key 操做符爲 Facet 字段取一個別名 .
例 :
&facet=on
&facet.field={!key=中央處理器}cpu
&facet.field={!key=顯卡}videoCard