7

I'm have a solr schema with dynamic field of different types in. Eg in the schema.xml there are:

<dynamicField name="*_s" type="string" indexed="true"  stored="true"/>
<dynamicField name="*_i" type="int"    indexed="true"  stored="true"/>
<dynamicField name="*_l" type="long"   indexed="true"  stored="true"/>
<dynamicField name="*_f" type="float"  indexed="true"  stored="true"/>
<dynamicField name="*_d" type="double" indexed="true"  stored="true"/>

And I want to access these field using a SolrJ annotated POJO. I know I can have different Map references for each data type in the POJO like this:

...
@Field("*_s")
public Map<String, String> strings;

@Field("*_i")
public Map<String, Integer> integers;
...

But is it possible to have all dynamic fields stored in the same map? I was thinking something like:

...
@Field("*_s")
@Field("*_i")
public Map<String, Object> dynamicFields;
...

The only documentation I can find about SolrJ, POJOs and dynamic fields is an old feature request: https://issues.apache.org/jira/browse/SOLR-1129

cheffe
  • 9,345
  • 2
  • 46
  • 57
Tim P
  • 948
  • 1
  • 12
  • 19

1 Answers1

10

I worked out the matching of the 'pattern' value in the @Field annotation doesn't have to match what's in your schema.xml. So, I defined a map in my doc class:

@Field("*DF")
private Map<String, Object> dynamicFields;

and then in the schema.xml the dynamicFields have patterns postfixed by 'DF':

<dynamicField name="*_sDF" type="string" indexed="true" stored="true"/>
<dynamicField name="*_siDF" type="sint" indexed="true" stored="true"/>
<dynamicField name="*_tDF" type="date" indexed="true" stored="true"/>

Now all the dynamicField with different value types get stored and retrieved using solrServer.addBean(doc) and solrResponse.getBeans(Doc.class). This is with Solr 3.2.0 It wasn't working with 1.4..

cheffe
  • 9,345
  • 2
  • 46
  • 57
Tim P
  • 948
  • 1
  • 12
  • 19
  • 1
    Thanks Tim, this helped me. I've also found that for dynamic fields, a pattern must be provided for the Field annotation, even if it's just "*". The 'stored' attribute can also be false. – Teddy Yueh Jun 16 '11 at 18:04