Solr支持多個查詢解析器,爲搜索應用程序設計者提供了很大的靈活性,可以控制如何解析查詢。
本節介紹如何指定要使用的查詢分析器。它還描述了solr中包含的主查詢解析器所支持的語法和特性,並描述了一些可能對特定情況有用的其他解析器。所有Solr解析器都有一些常見的查詢參數;這些參數在公共查詢參數一節中進行了討論。
- The Standard Query Parser
- The DisMax Query Parser
- The Extended DisMax Query Parser
- Other Parsers
- 常用查詢參數
- defType
- defType參數選擇solr用來處理請求中的主查詢參數(q)的查詢分析器。例如:
- 例如:defType=dismax
- 如果未指定defType參數,則默認情況下使用標準查詢分析器。(例如,defType=lucene)
- sort
- sort參數按升序(asc)或降序(desc)排列搜索結果。參數可以與數字或字母內容一起使用。可以用全部小寫字母或全部大寫字母輸入方向(即接受asc和ASC)
- Solr可以根據以下條件對查詢響應進行排序:
- 1、Document scores
- 2、Function results
- 3、任何原始字段(數字、字符串、布爾值、日期等)的值,其中docvalues=“true”(或multivalue=“false”和indexed=“true”,在這種情況下,索引術語將用於在運行時動態構建docvalue樣的結構)。
- 4、默認情況下,SortableTextField隱式使用docValues=“true”來允許對原始輸入字符串進行排序,而不管用於搜索的分析器是什麼。
- 5、使用分析器(如關鍵字標記器)的單值文本字段,每個文檔只生成一個術語。textfield不支持docvalues=“true”,但類似docvalue的結構將在運行時即時構建。
- 如果希望能夠對要標記其內容以便於搜索的字段進行排序,請在架構中使用copyfield指令來克隆該字段。然後搜索字段並對其克隆進行排序。
- 每個文檔中的最小值用於升序(asc)排序,而每個文檔中的最大值用於降序(desc)
- 此默認行爲相當於使用2個參數field()函數顯式排序:sort=field(name,min)asc和sort=field(name,max)desc
- 下表說明了SOLR如何響應排序參數的各種設置。
|
|
|
|
|
|
|
|
|
|
|
|
- 關於排序參數的參數:
- 1、排序順序必須包括字段名(或分數爲僞字段),後跟空格(在URL字符串中以+或%20轉義),後跟排序方向(asc或desc)。
- 2、使用以下語法,可以用逗號分隔多個排序順序:sort=<field name><direction>,<field name><direction>],…
- 3、當提供多個排序條件時,只有在第一個條目導致平局時,纔會使用第二個條目。如果有第三個條目,則僅當第一個條目和第二個條目綁定時才使用。此模式將繼續執行更多條目。
- start
指定後,start參數指定查詢結果集中的偏移量,並指示solr開始顯示來自該偏移量的結果。
默認值爲0。換句話說,默認情況下,solr返回的結果沒有偏移,從結果本身開始。將start參數設置爲其他數字(如3),會導致solr跳過前面的記錄,並從偏移量標識的文檔開始。
您可以這樣使用start參數進行分頁。例如,如果rows參數設置爲10,則可以通過將start設置爲0,然後重新發出相同的查詢,並將start設置爲10,然後再次發出查詢,並將start設置爲20來顯示連續三頁的結果。
- rows
可以使用rows參數對查詢結果進行分頁。參數指定SOLR一次應返回到客戶機的完整結果集中的最大文檔數。
默認值爲10。也就是說,默認情況下,solr一次返回10個文檔以響應查詢。
- fq (Filter Query)
fq參數定義了一個查詢,該查詢可用於限制可返回的文檔,而不影響分數。它對於加速複雜查詢非常有用,因爲使用fq指定的查詢是獨立於主查詢緩存的。當以後的查詢使用相同的過濾器時,會發生緩存命中,過濾器結果會從緩存中快速返回。
使用fq參數時,請記住以下幾點:
1)可以在查詢中多次指定fq參數。只有當文檔位於由參數的每個實例生成的文檔集在交集中時,文檔纔會包含在結果中。
在下面的示例中,只有popularity大於10且section爲0的文檔才匹配。
fq=popularity:[10 TO *]&fq=section:0
2)過濾查詢可能涉及複雜的布爾查詢。上面的例子也可以寫成一個fq,有兩個強制條款,比如:
fq=+popularity:[10 TO *] +section:0
- 每個篩選查詢中的文檔集都是獨立緩存的。因此,關於前面的例子:如果這些子句經常出現在一起,使用一個包含兩個強制子句的fq;如果它們相對獨立,則使用兩個單獨的fq參數。(要了解調整緩存大小並確保過濾器緩存實際存在http://lucene.apache.org/solr/guide/7_7/the-well-configured-solr-instance.html#the-well-configured-solr-instance)
- 還可以在fq中使用filter(condition)語法單獨緩存子句,以及實現緩存的篩選器查詢的聯合。
- 與所有參數一樣:URL中的特殊字符需要正確轉義並編碼爲十六進制值。在線工具可幫助您進行URL編碼。
https://meyerweb.com/eric/tools/dencoder/
- fl (Field List)
fl參數將查詢響應中包含的信息限制爲指定的字段列表。字段必須存儲爲stored="true" or docValues="true"`.`
字段列表可以指定爲空格分隔或逗號分隔的字段名稱列表。字符串“score”可用於指示應作爲字段返回特定查詢的每個文檔的分數。通配符*選擇文檔中stored="true" or docValues="true" and useDocValuesAsStored="true"的所有字段(啓用docvalues時默認)。您還可以向字段列表請求添加僞字段、函數和轉換器。
您還可以向字段列表請求添加僞字段、函數和轉換器。
此表顯示瞭如何使用fl的一些基本示例:
Field List |
Result |
id name price |
Return only the id, name, and price fields. |
id,name,price |
Return only the id, name, and price fields. |
id name, price |
Return only the id, name, and price fields. |
id score |
Return the id field and the score. |
* |
Return all the stored fields in each document, as well as any docValuesfields that have useDocValuesAsStored="true". This is the default value of the fl parameter. |
* score |
Return all the fields in each document, along with each field’s score. |
*,dv_field_name |
Return all the stored fields in each document, and any docValues fields that have useDocValuesAsStored="true" and the docValues from dv_field_name even if it has useDocValuesAsStored="false" |
fl中的函數
可以爲結果中的每個文檔增加計算函數,並作爲僞字段返回:
函數參考:
http://lucene.apache.org/solr/guide/7_7/function-queries.html#function-queries
fl=id,title,product(price,popularity)
fl中的轉換器
文檔轉換器可用於修改查詢結果中每個文檔返回的信息:
fl=id,title,[explain]
文檔結果轉換器參考:
字段別名
您可以將字段、函數或轉換器的響應中使用的鍵更改,方法是在其前面加上一個`“displayname:`”。例如:
fl=id,sales_price:price,secret_sauce:prod(price,popularity),why_score:[explain style=nl]
{"response": {
"numFound": 2,
"start": 0,
"docs": [{
"id": "6H500F0",
"secret_sauce": 2100.0,
"sales_price": 350.0,
"why_score": {
"match": true,
"value": 1.052226,
"description": "weight(features:cache in 2) [DefaultSimilarity], result of:",
"details": [{
"..."
}]}}]}}
- debug
調試參數可以多次指定,並支持以下參數:
debug=query:僅返回有關查詢的調試信息。
debug=timing:返回有關查詢處理時間的調試信息。
debug=results:返回有關分數結果的調試信息(也稱爲“explain”)。
默認情況下,分數解釋將作爲大字符串值返回,使用換行符和製表符縮進實現結構和可讀性,但可以指定附加的debug.explain.structured=true參數,以將此信息作爲wt請求的響應格式的固有嵌套數據結構返回。
debug=all返回有關請求的所有可用調試信息。(或者用法:debug=true)。
爲了與舊版本的solr向後兼容,可以將debugquery=true指定爲指示debug=all的替代方法。
默認行爲不包括調試信息。
- explainOther
explainOther參數指定Lucene查詢以標識一組文檔。如果包含此參數並將其設置爲非空值,則查詢將返回相對於主查詢(由q參數指定)的調試信息以及與Lucene查詢匹配的每個文檔的“解釋信息”。例如:
q=supervillians&debugQuery=on&explainOther=id:juggernaut
上面的查詢允許您檢查頂部匹配文檔的得分解釋信息,將其與文檔匹配ID:Juggernaut的解釋信息進行比較,並確定排名爲什麼不像您期望的那樣。
此參數的默認值爲空,不會返回額外的“解釋信息”。
- timeAllowed
此參數指定搜索完成所允許的時間量(毫秒)。如果此時間在搜索完成之前過期,則將返回任何部分結果,但對於整個結果集,numfound、facet counts和result stats等值可能不準確。
此值僅在以下時間檢查:
- 查詢擴展,以及
- 文檔收集
由於此檢查是定期執行的,因此在中止請求之前可以處理請求的實際時間將略大於或等於所允許的時間值。如果請求在其他階段、自定義組件等消耗更多時間,則不希望此參數中止請求。
- segmentTerminateEarly
早期分段終止,
此參數可以設置爲true或false。如果設置爲true,並且此集合的MergePolicyFactory是使用與爲此查詢指定的排序參數兼容的排序選項的SortingMergePolicyFactory,則Solr將嘗試使用EarlyTerminingSortingCollector。如果使用提前終止,則在ResponseHeader中將包含SegmentTerminatedEarly頭段。
與使用timeallowed參數類似,當發生早期段終止時,numfound、facet counts和result stats等值對於整個結果集可能不準確。
此參數的默認值爲false。
- omitHeader
此參數可以設置爲true或false。
如果設置爲true,則此參數將從返回的結果中排除頭部信息。頭包含有關請求的信息,例如完成請求所需的時間。此參數的默認值爲假。
- wt
wt參數選擇solr用來格式化查詢響應的響應編寫器。有關響應編寫器的詳細說明,
參考:
http://lucene.apache.org/solr/guide/7_7/response-writers.html#response-writers
如果您沒有在查詢中定義wt參數,JSON將作爲響應的格式返回。
- cache
Solr默認緩存所有查詢的結果並篩選(filter)查詢。要禁用結果緩存,請設置cache=false參數。
You can also use the cost option to control the order in which non-cached filter queries are evaluated. This allows you to order less expensive non-cached filters before expensive non-cached filters.
你可以使用cost選項控制不緩存的過濾查詢被評估。這允許你在昂貴的非緩存過濾器之前使用更便宜的非緩存過濾器。
對於非常高成本的過濾器,如果cache=false和cost>=100並且查詢實現了postfilter接口,那麼將從該查詢請求一個收集器,並在文檔與主查詢和所有其他過濾器查詢匹配後用於過濾文檔。可以有多個post過濾器;它們也按成本排序。
對於大多數查詢,默認行爲cost=0 - ,但某些類型的查詢(如{!frange})默認爲成本=100,因爲它們在用作PostFilter時更高效。
例如:
這是3個常規過濾器的示例,其中每個過濾器生成的所有匹配文檔都是預先計算並獨立緩存的:
q=some keywords
fq=quantity_in_stock:[5 TO *]
fq={!frange l=10 u=100}mul(popularity,price)
fq={!frange cost=200 l=0}pow(mul(sum(1, query('tag:smartphone')), div(1,avg_rating)), 2.3)
frange :http://lucene.apache.org/solr/guide/7_7/other-parsers.html#function-range-query-parser
mul:乘法 pow 平方
這些都是運行不帶緩存的相同篩選器。對庫存(quantity_in_stock)字段中數量的簡單範圍查詢將與主查詢並行運行,就像傳統的Lucene過濾器一樣,而兩個frange過濾器將只針對每個已經匹配主查詢的文檔進行檢查,並且庫存範圍查詢中的數量將首先進行檢查(因爲o如果它是隱式成本=100),並且只有當它匹配時,纔會檢查最終的非常複雜的過濾器(其較高的成本=200)。
logParamsList
默認情況下,solr會記錄請求的所有參數。設置此參數以限制記錄請求的哪些參數。這可能有助於控制日誌記錄到那些被認爲對您的組織很重要的參數。
例如,您可以這樣定義:
logParamsList=q,fq
並且只有‘q’和‘fq’參數將被記錄。
如果不應記錄任何參數,則可以將logParamsList作爲空發送(即logParamsList=)。
此參數不僅適用於查詢請求,而且適用於對Solr的任何類型的請求。
echoParams
echoParams參數控制在響應頭中包含哪些有關請求參數的信息。
echoParams參數接受以下值:
explicit:這是默認值。只有包含在實際請求中的參數,加上_ parameter(64位數字時間戳)將添加到響應頭的params部分。
all:包含用於查詢的所有請求參數。這將包括在solrconfig.xml中找到的請求處理程序定義中定義的所有內容,以及請求中包含的參數以及_ parameter。如果在請求處理程序定義和請求中包含了一個參數,那麼它將多次出現在響應頭中。
none:完全刪除響應頭的params部分。響應中沒有有關請求參數的信息。
下面是一個JSON響應的示例,其中未包含echo Params參數,因此顯式的默認值是活動的。創建此響應的請求URL包括三個參數-q、wt和縮進:
{
"responseHeader": {
"status": 0,
"QTime": 0,
"params": {
"q": "solr",
"indent": "true",
"wt": "json",
"_": "1458227751857"
}
},
"response": {
"numFound": 0,
"start": 0,
"docs": []
}
}
如果發送類似的請求,將echoparams=all添加到前一個示例中使用的三個參數中,就會發生這種情況:
{
"responseHeader": {
"status": 0,
"QTime": 0,
"params": {
"q": "solr",
"df": "text",
"preferLocalShards": "false",
"indent": "true",
"echoParams": "all",
"rows": "10",
"wt": "json",
"_": "1458228887287"
}
},
"response": {
"numFound": 0,
"start": 0,
"docs": []
}
}
http://lucene.apache.org/solr/guide/7_7/common-query-parameters.html