Spring Solr: Using Custom Converters to Serialize object to Json String in Solr

The Problem
There are two kinds of data when save data to Solr: fields that we will search on, other fields that we will never search on.

Schemaless design
We can save all non-searchable fields to one Json string field into Solr, this way, we don't have to change Solr schema every time we add/remove a field.

We want to use object in java class, serialize it to json stirng when save to Solr, and deserialize the json string to object when read from Solr.

Solution:
As we use Spring Solr to save and restore data to/from Solr, all we need to do is implement and register custom solr converters that will convert object to json string when save to Solr, convert json string to object when read data from Solr.

We store the following Message data in Solr:
Class Message {
  long id;
  // searchable fields such as activeDate, city etc
  MessageDetails details;
}

MessageDetails implements Jsonable, Serializable {
  // all non-searchable fields define here.
}

//Mark interface: this instance will be serialized to json string when save to Solr.
public interface Jsonable {}

The 
Solr Converters
Then we will implement Solr Converters like below.
JsonableToStringConverter will convert the object into string; StringToMessageDetailsConverter will convert string instance to MessageDetails.
public class Converters {
  @WritingConverter
  public enum JsonableToStringConverter implements Converter<Jsonable, String> {
      INSTANCE;
      @Override
      public String convert(final Jsonable source) {
          if (source == null) {
              return null;
          }
          final ObjectMapper mapper = new ObjectMapper();

          try {
              return mapper.writeValueAsString(source);
          } catch (final JsonProcessingException e) {
              logger.error(MessageFormat.format("Unable to serialize to json; source: {0}", source), e);
              throw new BusinessException(ErrorCode.INTERNAL_ERROR, "Unable to serialize to json.");
          }
      }
  }

  @ReadingConverter
  public enum StringToMessageDetailsConverter implements Converter<String, MessageDetails> {
      INSTANCE;

      @Override
      public MessageDetails convert(final String source) {
          if (source == null) {
              return null;
          }
          try {
              return new ObjectMapper().readValue(source, MessageDetails.class);
          } catch (final IOException e) {
              logger.error(MessageFormat.format("Unable to deserialize from json; source: {0}", source), e);
              throw new BusinessException(ErrorCode.INTERNAL_ERROR, "Unable to deserialize from json.");
          }
      }
  }
}
At last we will register these customer converters into SolrConverter.
  @Bean
  public static SolrConverter mappingSolrConverter() {
      final MappingContext<? extends SolrPersistentEntity<?>, SolrPersistentProperty> mappingContext =
              new SimpleSolrMappingContext();
      final MappingSolrConverter converter = new MappingSolrConverter(mappingContext);
      final List<Object> converters = new ArrayList<Object>();

      converters.add(JsonableToStringConverter.INSTANCE);
      converters.add(StringToMessageDetailsConverter.INSTANCE);        
      converter.setCustomConversions(new CustomConversions(converters));
      return converter;
  }

Post a Comment

Labels

Java (159) Lucene-Solr (110) All (60) Interview (59) J2SE (53) Algorithm (37) Eclipse (35) Soft Skills (35) Code Example (31) Linux (26) JavaScript (23) Spring (22) Windows (22) Web Development (20) Tools (19) Nutch2 (18) Bugs (17) Debug (15) Defects (14) Text Mining (14) J2EE (13) Network (13) PowerShell (11) Chrome (9) Continuous Integration (9) How to (9) Learning code (9) Performance (9) UIMA (9) html (9) Design (8) Dynamic Languages (8) Http Client (8) Maven (8) Security (8) Trouble Shooting (8) bat (8) blogger (8) Big Data (7) Google (7) Guava (7) JSON (7) Problem Solving (7) ANT (6) Coding Skills (6) Database (6) Scala (6) Shell (6) css (6) Algorithm Series (5) Cache (5) IDE (5) Lesson Learned (5) Miscs (5) Programmer Skills (5) System Design (5) Tips (5) adsense (5) xml (5) AIX (4) Code Quality (4) GAE (4) Git (4) Good Programming Practices (4) Jackson (4) Memory Usage (4) OpenNLP (4) Project Managment (4) Python (4) Spark (4) Testing (4) ads (4) regular-expression (4) Android (3) Apache Spark (3) Become a Better You (3) Concurrency (3) Eclipse RCP (3) English (3) Firefox (3) Happy Hacking (3) IBM (3) J2SE Knowledge Series (3) JAX-RS (3) Jetty (3) Restful Web Service (3) Script (3) regex (3) seo (3) .Net (2) Android Studio (2) Apache (2) Apache Procrun (2) Architecture (2) Batch (2) Build (2) Building Scalable Web Sites (2) C# (2) C/C++ (2) CSV (2) Career (2) Cassandra (2) Distributed (2) Fiddler (2) Google Drive (2) Gson (2) Html Parser (2) Http (2) Image Tools (2) JQuery (2) Jersey (2) LDAP (2) Life (2) Logging (2) Software Issues (2) Storage (2) Text Search (2) xml parser (2) AOP (1) Application Design (1) AspectJ (1) Bit Operation (1) Chrome DevTools (1) Cloud (1) Codility (1) Data Mining (1) Data Structure (1) ExceptionUtils (1) Exif (1) Feature Request (1) FindBugs (1) Greasemonkey (1) HTML5 (1) Httpd (1) I18N (1) IBM Java Thread Dump Analyzer (1) JDK Source Code (1) JDK8 (1) JMX (1) Lazy Developer (1) Mac (1) Machine Learning (1) Mobile (1) My Plan for 2010 (1) Netbeans (1) Notes (1) Operating System (1) Perl (1) Problems (1) Product Architecture (1) Programming Life (1) Quality (1) Redhat (1) Redis (1) Review (1) RxJava (1) Solutions logs (1) Team Management (1) Thread Dump Analyzer (1) Troubleshooting (1) Visualization (1) boilerpipe (1) htm (1) ongoing (1) procrun (1) rss (1)

Popular Posts