You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by Apache Wiki <wi...@apache.org> on 2011/09/28 13:52:25 UTC

[Solr Wiki] Update of "MoneyFieldType" by JanHoydahl

Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Solr Wiki" for change notification.

The "MoneyFieldType" page has been changed by JanHoydahl:
http://wiki.apache.org/solr/MoneyFieldType

Comment:
New page

New page:
<!> [[Solr3.5]] (most probably, this work is not yet committed)

The MoneyFieldType was created by Greg Fodor in [[https://issues.apache.org/jira/browse/SOLR-2202|SOLR-2202]], and is an advanced poly field type indexing a monetary value as both value and currency. It lets e.g. an e-commerce site to display and query prices in many currencies, while only indexing the price in one field/currency.

The field type is backed by an XML file {{{currency.xml}}} specifying exchange rates. This file may be updated without need for reindexing, and a reload-core will set live the updated exchange rates.

=== Configuration ===
See example schema for example of how to use the field type. The field type and field is defined in schema.xml as follows:
{{{
  <fieldType name="money" class="solr.MoneyType" currencyConfig="currency.xml" />

  <field name="price" type="money" defaultCurrency="EUR" />
}}}

!DefaultCurrency will be used if you do not specify a currency. The default defaultCurrency is {{{USD}}}, if not specified. Note that defaultCurrency cannot be changed unless followed by a full re-index.

You then need to point to a {{{currency.xml}}} file specifying the exchange rates:

{{{
<currencyConfig version="1.0">
  <rates>
    <!-- Example -->
    <rate from="USD" to="JPY" rate="81.29"/>

    <!-- Fake rates for testing -->
    <rate from="USD" to="EUR" rate="2.5"/>
    <rate from="USD" to="GBP" rate="0.5"/>
    <rate from="EUR" to="GBP" rate="0.5"/>

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

Note that you need a rate entry between every two pairs of currencies you will index or query. So if you handle USD, EUR and GBP, you need USD->EUR, USD->GBP and EUR->GBP, so that all possible conversions can be done. If you only index one currency (say USD) but want to query or convert multiple, it is enough to have rates between USD and all currencies you'll query or display.

By default the rate will be symmetrical, but you may override this by explicitly specifying the reverse rate.
}}}

!MoneyFieldType supports replication, given that you explicitly configure replication for {{{currency.xml}}} and {{{currency.xml.drift.properties}}}. See [[SolrReplication#How_are_configuration_files_replicated.3F|SolrReplication]] for more.

=== Indexing ===
When you index e.g. a price, you specify value and currency separated by comma:
{{{
<doc>
  <field name="id">1</field>
  <field name="price">100,USD</field>
</doc>
}}}

=== Querying ===
The !MoneyFieldType supports both point queries and range queries. Here are some valid money queries. Assume default currency is {{{EUR}}}:
{{{
price:25,EUR                   or price:25
price:[* TO 10,EUR]            or price:[* TO 10]
price:[10,USD TO 100,USD]
price:1000,NOK
}}}

== TODO ==
 * How do decimals work?
 * Can you return a value in another currency than what's indexed in the search result?
 * Range facets do not work with this field type - this should be fixed