货币和汇率

currency FieldType 为 Solr 提供对货币值的支持,具有查询时的货币转换和汇率功能。支持以下功能:

  • 点查询

  • 范围查询

  • 函数范围查询

  • 排序

  • 通过货币代码或符号进行货币解析

  • 对称和非对称汇率(如果兑换货币涉及费用,则非对称汇率非常有用)

  • 范围分面(使用 facet.rangejson.facet 中的 type:range),只要 startend 值以相同的货币指定。

配置货币

CurrencyField 已被弃用

CurrencyField 已被弃用,建议使用 CurrencyFieldType;以下所有配置示例都使用 CurrencyFieldType。

currency 字段类型在模式中定义。这是此类型的默认配置。

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

在此示例中,我们定义了字段类型的名称和类,并将 defaultCurrency 定义为 "USD",即美元。我们还定义了一个 currencyConfig 以使用名为 "currency.xml" 的文件。这是一个从我们的默认货币到其他货币的汇率文件。还有一种替代实现方式允许定期下载货币数据。请参阅下面的汇率了解更多信息。

许多 Solr 附带的示例模式都包含一个使用此类型的动态字段,例如此示例

    <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" 动态字段,该字段必须存在于模式中,并且使用 long 字段类型,即扩展 LongValueFieldType 的类型。货币代码字段将使用 "*_s_ns" 动态字段,该字段必须存在于模式中,并且使用 string 字段类型,即是或扩展 StrField 的类型。

如果存储了动态子字段,原子更新将无法工作

正如原子更新字段存储中所述,当您使用原子更新时,存储的动态子字段会导致索引失败。为了避免这个问题,请在这些动态字段上指定 stored="false"

汇率

您可以通过指定提供程序来配置汇率。原生支持两种提供程序类型:FileExchangeRateProviderOpenExchangeRatesOrgProvider

FileExchangeRateProvider

此提供程序要求您提供一个包含汇率的文件。它是默认的,这意味着要使用此提供程序,您只需要在为此类型定义的 currencyConfig 中指定文件路径和名称作为值。

Solr 中包含一个示例 currency.xml 文件,该文件与模式文件位于同一目录中。以下是该文件中的一个小片段

<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 分钟下载最新的汇率。刷新间隔可以增加,但不能减少。