貨幣與匯率

currency FieldType 提供對 Solr 的貨幣價值支援,具有查詢時的貨幣轉換與匯率。支援下列功能

  • 點查詢

  • 範圍查詢

  • 函式範圍查詢

  • 排序

  • 依貨幣代碼或符號剖析貨幣

  • 對稱與非對稱匯率(如果兌換貨幣有相關費用,非對稱匯率會很有用)

  • 範圍分面(使用 facet.rangejson.facet 中的 type:range),只要 startend 值是以相同的貨幣指定。

設定貨幣

CurrencyField 已棄用

CurrencyField 已棄用,改用 CurrencyFieldType;下方所有設定範例皆使用 CurrencyFieldType。

currency 欄位類型定義在 schema 中。這是此類型的預設設定。

<fieldType name="currency" class="solr.CurrencyFieldType"
           amountLongSuffix="_l_ns" codeStrSuffix="_s_ns"
           defaultCurrency="USD" currencyConfig="currency.xml" />

在此範例中,我們定義了欄位類型的名稱和類別,並將 defaultCurrency 定義為「USD」,代表美元。我們也定義了 currencyConfig 來使用名為「currency.xml」的檔案。這是我們的預設貨幣對其他貨幣之間的匯率檔案。還有另一種實作方式可以定期下載貨幣資料。請參閱下方的 匯率 了解更多資訊。

許多隨 Solr 提供的範例 schema 都包含使用此類型的 動態欄位,例如此範例

    <dynamicField name="*_c"   type="currency" indexed="true"  stored="true"/>

此動態欄位會比對任何以 _c 結尾的欄位,並將其設為貨幣類型欄位。

在索引時,貨幣欄位可以使用其原始貨幣來索引。例如,如果電子商務網站上的產品以歐元列出,則將價格欄位索引為「1000,EUR」將會正確索引。價格應以逗號與貨幣分隔,且價格必須以浮點數值(小數點)編碼。

在查詢處理期間,範圍查詢和點查詢都支援。

子欄位後綴

您必須指定參數 amountLongSuffixcodeStrSuffix,對應到動態欄位,分別用於原始金額和貨幣動態子欄位,例如:

<fieldType name="currency" class="solr.CurrencyFieldType"
           amountLongSuffix="_l_ns" codeStrSuffix="_s_ns"
           defaultCurrency="USD" currencyConfig="currency.xml" />

在上面的範例中,原始金額欄位將使用 "*_l_ns" 動態欄位,該欄位必須存在於 schema 中,並且使用 long 欄位類型,也就是擴展自 LongValueFieldType 的類型。貨幣代碼欄位將使用 "*_s_ns" 動態欄位,該欄位必須存在於 schema 中,並且使用 string 欄位類型,也就是屬於或擴展自 StrField 的類型。

如果儲存了動態子欄位,原子更新將無法運作。

原子更新欄位儲存所述,當您使用原子更新時,儲存的動態子欄位會導致索引失敗。為避免此問題,請在這些動態欄位上指定 stored="false"

匯率

您可以透過指定提供者來設定匯率。原生支援兩種提供者類型:FileExchangeRateProviderOpenExchangeRatesOrgProvider

FileExchangeRateProvider

這個提供者要求您提供一個包含匯率的檔案。它是預設值,這表示要使用此提供者,您只需要在這種型別的定義中,將檔案路徑和名稱指定為 currencyConfig 的值即可。

Solr 隨附一個範例 currency.xml 檔案,位於與 schema 檔案相同的目錄中。以下是此檔案的一小段程式碼:

<currencyConfig version="1.0">
  <rates>
    <!-- Updated from http://www.exchangerate.com/ at 2011-09-27 -->
    <rate from="USD" to="ARS" rate="4.333871" comment="ARGENTINA Peso" />
    <rate from="USD" to="AUD" rate="1.025768" comment="AUSTRALIA Dollar" />
    <rate from="USD" to="EUR" rate="0.743676" comment="European Euro" />
    <rate from="USD" to="CAD" rate="1.030815" comment="CANADA Dollar" />

    <!-- Cross-rates for some common currencies -->
    <rate from="EUR" to="GBP" rate="0.869914" />
    <rate from="EUR" to="NOK" rate="7.800095" />
    <rate from="GBP" to="NOK" rate="8.966508" />

    <!-- Asymmetrical rates -->
    <rate from="EUR" to="USD" rate="0.5" />
  </rates>
</currencyConfig>

OpenExchangeRatesOrgProvider

您可以設定 Solr 從 OpenExchangeRates.Org 下載匯率,每小時更新美元與 170 種貨幣之間的匯率。這些匯率僅為對稱的。

在這種情況下,您需要在欄位類型的定義中指定 providerClass,並註冊 API 金鑰。以下是一個範例:

<fieldType name="currency" class="solr.CurrencyFieldType"
           amountLongSuffix="_l_ns" codeStrSuffix="_s_ns"
           providerClass="solr.OpenExchangeRatesOrgProvider"
           refreshInterval="60"
           ratesFileLocation="http://www.openexchangerates.org/api/latest.json?app_id=yourPersonalAppIdKey"/>

refreshInterval 的單位是分鐘,因此上述範例將每 60 分鐘下載最新的匯率。更新間隔可以增加,但不能減少。