货币和汇率

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

  • 点查询

  • 范围查询

  • 函数范围查询

  • 排序

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

  • 对称和非对称汇率(如果与兑换货币相关联有费用,则非对称汇率很有用)

  • 范围分面(在 json.facet 中使用 facet.rangetype: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" 动态字段,该字段必须存在于模式中并使用长字段类型,即扩展 LongValueFieldType 的字段。货币代码字段将使用 "*_s_ns" 动态字段,该字段必须存在于模式中并使用字符串字段类型,即为 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 分钟下载一次最新汇率。刷新间隔可以增加,但不能减少。