請求參數 API

請求參數 API 允許建立參數集,也稱為 paramset,這些參數集可以覆寫或取代在 solrconfig.xml 中定義的參數。

使用此 API 定義的參數集可以用於對 Solr 的請求中,或直接在 solrconfig.xml 請求處理器定義中引用。

它實際上是 Config API 的另一個端點,而不是一個獨立的 API,並且具有不同的命令。它不會取代或修改 solrconfig.xml 的任何部分,而是提供了另一種處理請求中使用的參數的方法。它的行為方式與 Config API 相同,將參數儲存在另一個檔案中,該檔案將在執行階段使用。在這種情況下,參數儲存在名為 params.json 的檔案中。當運行 SolrCloud 時,此檔案會保存在 ZooKeeper 中,或者保存在使用者管理的集群或單節點安裝的 conf 目錄中。

在某些情況下,params.json 中儲存的設定會在查詢時用於覆寫 solrconfig.xml 中定義的設定,如下所述。

您可能希望使用此功能的情況?

  • 避免頻繁編輯 solrconfig.xml 以更新經常變更的請求參數。

  • 在各種請求處理器之間重複使用參數。

  • 在請求時混合和匹配參數集。

  • 避免為了小的參數變更而重新載入集合。

請求參數端點

所有請求都發送到 Config API 的 /config/params 端點。

設定請求參數

設定或更新請求參數的請求會以帶有名稱的對應集形式發送。這些物件可以直接用於請求或請求處理器定義中。刪除參數集的請求會以名稱列表或名稱的形式發送。

可用的命令為

  • set:建立或覆寫參數集映射。

  • delete:移除請求參數集映射。

  • update:更新參數集映射。這等同於 map.putAll(newMap)。兩個映射會合併,如果新映射的鍵與舊映射相同,則會覆寫舊映射的值。

如有必要,您可以將這些指令混合在單個請求中。

對於 setupdate 指令,每個映射都必須包含一個名稱,以便稍後可以在直接向 Solr 發出的請求中或在請求處理器定義中引用它。

在以下範例中,我們設定了兩個名為 'myFacets' 和 'myQueries' 的參數集。

curl https://127.0.0.1:8983/solr/techproducts/config/params -H 'Content-type:application/json'  -d '{
  "set":{
    "myFacets":{
      "facet":"true",
      "facet.limit":5}},
  "set":{
    "myQueries":{
      "defType":"edismax",
      "rows":"5",
      "df":"text_all"}}
}'

在上面的範例中,所有參數都等同於 solrconfig.xml 中的 "defaults"。可以如下添加 invariants 和 appends:

curl https://127.0.0.1:8983/solr/techproducts/config/params -H 'Content-type:application/json'  -d '{
  "set":{
    "my_handler_params":{
      "facet.limit":5,
      "_invariants_": {
        "facet":true,
       },
      "_appends_":{"facet.field":["field1","field2"]
     }
   }}
}'

在以下範例中,兩個名為 'myFacets' 和 'myQueries' 的參數集被刪除。

curl https://127.0.0.1:8983/solr/techproducts/config/params -H 'Content-type:application/json'  -d '{
  "delete":[
    "myFacets",
    "myQueries"
  ]
}'

刪除單個參數集時,該值可以指定為字串而不是列表。

curl https://127.0.0.1:8983/solr/techproducts/config/params -H 'Content-type:application/json'  -d '{
  "delete":"myFacets"
}'

將請求參數與請求處理器一起使用

在上一節中建立 my_handler_params 參數集後,可以如下定義請求處理器:

<requestHandler name="/my_handler" class="solr.SearchHandler" useParams="my_handler_params"/>

這將等同於標準的請求處理器定義,例如:

<requestHandler name="/my_handler" class="solr.SearchHandler">
  <lst name="defaults">
    <int name="facet.limit">5</int>
  </lst>
  <lst name="invariants">
    <bool name="facet">true</bool>
  </lst>
  <lst name="appends">
    <arr name="facet.field">
      <str>field1</str>
      <str>field2</str>
    </arr>
  </lst>
</requestHandler>

使用請求參數 API 的隱式請求處理器

Solr 附帶許多開箱即用的請求處理器,這些處理器可能只能通過請求參數 API 進行配置,因為它們的配置不存在於 solrconfig.xml 中。請參閱隱式請求處理器,以了解配置隱式請求處理器時要使用的參數集。

使用請求處理器檢視展開的參數集和有效參數

若要查看使用 useParams 定義的請求處理器的展開參數集和產生的有效參數,請使用 expandParams 請求參數。例如,對於 /export 請求處理器:

$ curl https://127.0.0.1:8983/solr/techproducts/config/requestHandler?componentName=/export&expandParams=true

檢視請求參數

若要查看已建立的參數集,您可以使用 /config/params 端點來讀取 params.json 的內容,或使用請求中的名稱:

$ curl https://127.0.0.1:8983/solr/techproducts/config/params

#Or use the paramset name
$ curl https://127.0.0.1:8983/solr/techproducts/config/params/myQueries

useParams 參數

發出請求時,useParams 參數會將傳送至請求的請求參數套用。這會在請求時轉換為實際參數。

例如(使用我們在先前範例中設定的名稱,請替換為您自己的名稱):

https://127.0.0.1/solr/techproducts/select?useParams=myQueries

可以在同一個請求中傳遞多個參數集。例如:

https://127.0.0.1/solr/techproducts/select?useParams=myFacets,myQueries

在上面的範例中,參數集 'myQueries' 會覆蓋在 'myFacets' 之上。因此,'myQueries' 中的值會優先於 'myFacets' 中的值。此外,請求中傳遞的任何值都會優先於 useParams 參數。這就像 solrconfig.xml<requestHandler> 定義中指定的 "defaults"。

參數集可以直接在請求處理器定義中使用,如下所示。請注意,即使請求包含 useParams,指定的 useParams 也始終會套用。

<requestHandler name="/terms" class="solr.SearchHandler" useParams="myQueries">
  <lst name="defaults">
    <bool name="terms">true</bool>
    <bool name="distrib">false</bool>
  </lst>
  <arr name="components">
    <str>terms</str>
  </arr>
</requestHandler>

總之,參數會依此順序套用:

  • solrconfig.xml<invariants> 中定義的參數。

  • params.jsoninvariants 中套用的參數,並在請求處理器定義中,甚至在單個請求中指定。

  • 直接在請求中定義的參數。

  • 在請求中定義的參數集,依據它們在 useParams 中列出的順序。

  • 在請求處理器中定義的 params.json 中定義的參數集。

  • solrconfig.xml<defaults> 中定義的參數。

公用 API

可以使用方法 SolrConfig#getRequestParams() 存取 RequestParams 物件。每個參數集可以使用方法 RequestParams#getRequestParams(String name) 透過其名稱存取。

使用請求參數 API 的範例

Solr “films” 範例示範了參數 API 的使用。您可以在 Solr 安裝中 (在 example/films 目錄中) 使用此範例,或在 Solr GitHub 鏡像中檢視檔案:https://github.com/apache/solr/tree/main/solr/example/films