处理货币和汇率

currency 字段类型给 Solr/Lucene 提供了包含查询时货币转换和汇率在内的金融值。 它支持以下特性:

  • 点查询
  • 范围查询
  • 函数范围查询
  • 排序
  • 根据货币编码或符号的货币解析
  • 对称和非对称汇率(非对称汇率对存在货币转换税率的场景很有用)

配置货币

currency 字段类型定义在 schema.xml 中。 下面是该类型的默认配置:

  1. <fieldType name="currency" class="solr.CurrencyField" precisionStep="8"
  2. defaultCurrency="USD" currencyConfig="currency.xml" />

本例中,我们定义了名称和字段类型的类,并且定义了 defaultCurrencyUSD,及美元。 我们也定义了一个 currencyConfig 来使用一个称为 currency.xml 的文件。 它是一个包含我们的默认货币和其他货币之间的汇率的文件。 还有一个替代实现允许周期地下载货币数据。详见下文 汇率

在索引时,金钱字段可以原生的货币进行索引。 如,一个欧洲电商网站上的某个产品,将其价格字段索引为 1000,EUR 能正确地索引。 其价格和货币之间应该有一个逗号隔开,且价格必须以浮点值编码 (小数点)。

在查询处理中,范围和点查询都支持。

汇率

你可以通过指定一个提供商来配置汇率。 原生的支持两种类型的提供商: FileExchangeRateProviderOpenExchangeRatesOrgProvider

FileExchangeRateProvider

这个提供商需要你提供一个汇率文件。 它是默认的,即使用它,你只需要指定文件路径和名称作为该类型定义中 currencyConfig 的值即可。

在 Solr 中包含了一个示例 currency.xml,可在 schema.xml 文件相同的目录下找到。 以下是该文件的小片段:

  1. <currencyConfig version="1.0">
  2. <rates>
  3. <!-- Updated from http://www.exchangerate.com/ at 2011-09-27 -->
  4. <rate from="USD" to="ARS" rate="4.333871" comment="ARGENTINA Peso" />
  5. <rate from="USD" to="AUD" rate="1.025768" comment="AUSTRALIA Dollar" />
  6. <rate from="USD" to="EUR" rate="0.743676" comment="European Euro" />
  7. <rate from="USD" to="CAD" rate="1.030815" comment="CANADA Dollar" />
  8. <!-- Cross-rates for some common currencies -->
  9. <rate from="EUR" to="GBP" rate="0.869914" />
  10. <rate from="EUR" to="NOK" rate="7.800095" />
  11. <rate from="GBP" to="NOK" rate="8.966508" />
  12. <!-- Asymmetrical rates -->
  13. <rate from="EUR" to="USD" rate="0.5" />
  14. </rates>
  15. </currencyConfig>

OpenExchangeRatesOrgProvider

你可以配置 Solr 从 http://www.OpenExchangeRates.Org 下载汇率, 它每个小时都会更新美元和 158 种货币的汇率。这些汇率只是对称的。

这里,你需要在字段类型的定义中指定 providerClass。如下例:

  1. <fieldType name="currency" class="solr.CurrencyField" precisionStep="8"
  2. providerClass="solr.OpenExchangeRatesOrgProvider"
  3. refreshInterval="60"
  4. ratesFileLocation="http://www.openexchangerates.org/api/latest.json?app_id=yourPersonalAppIdKey"/>

其中 refreshInterval 是分钟,因此上述示例将每 60 分钟下载一次最新的汇率。 其刷新间隔可以加快,而不能减慢。