Assume you have large amount of text data and want to do search on your data. You decided to use elasticsearch or solr as search engine. Spring Data is your friend. This document shows an example application that uses elasticsearch with spring data. This application uses elasticsearch and JPA at the same time. Data comes from mysql and goes to elasticsearch.
Create document class to represent your domain object.
Next thing you need is repository class to manage your domain object. Query methods are possible.
Now we can work store data to elasticsearch using repository object. For JPA entity and repository classes see [1]. Component annotation makes this class spring managed. Autowired annotation tells spring to create required repository objects. Transactional annotation is required for declarative transaction management.
Now spring boot application entry point comes. EnableElasticsearchRepositories is need to activate elasticsearch repository. Since another repository is enabled, it is required to enable Jpa repository with EnableJpaRepositories.
Spring boot configures many details transparently. Spring data abstracts many internals from our views and makes life easier for us.
For complete listing on github see [2].
1. Spring Boot JPA Application
2. Github - essync
Create document class to represent your domain object.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// document class for elasticsearch domain object | |
@Document(indexName = "recipe", type = "recipe", shards = 1, replicas = 0, refreshInterval = "-1") | |
public class RecipeEntityES { | |
@Id | |
private Integer id; | |
private String name; | |
private String author; | |
@Field(type = FieldType.String) | |
@Version | |
private Long version; | |
public Integer getId() { | |
return id; | |
} | |
public void setId(Integer id) { | |
this.id = id; | |
} | |
... | |
} |
Next thing you need is repository class to manage your domain object. Query methods are possible.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public interface RecipeRepositoryES extends ElasticsearchRepository<RecipeEntityES, Integer>, PagingAndSortingRepository<RecipeEntityES, Integer> { | |
List<RecipeEntityES> findByName(String name); | |
} |
Now we can work store data to elasticsearch using repository object. For JPA entity and repository classes see [1]. Component annotation makes this class spring managed. Autowired annotation tells spring to create required repository objects. Transactional annotation is required for declarative transaction management.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Component | |
public class MysqlESSync { | |
private static final Logger logger = LoggerFactory.getLogger(MysqlESSync.class); | |
@Autowired | |
private RecipeRepositoryES recipeRepositoryES; | |
@Autowired | |
private RecipeRepository recipeRepository; | |
@Transactional | |
public void run() throws Exception { | |
logger.info("Sync started"); | |
int nrecords = 0; | |
for (RecipeEntity recipeEntity : recipeRepository.findAll()) { | |
nrecords++; | |
RecipeEntityES recipeEntityES = new RecipeEntityES(); | |
recipeEntityES.setAuthor(recipeEntity.getAuthor()); | |
recipeEntityES.setCategories(recipeEntity.getCategories().stream().map(CategoryEntity::getName).collect(Collectors.toList())); | |
recipeEntityES.setImages(recipeEntity.getImages().getUrl()); | |
recipeRepositoryES.save(recipeEntityES); | |
logger.info("Record {} saved", recipeEntityES); | |
} | |
logger.info("Sync ended with {} records", nrecords); | |
} | |
} |
Now spring boot application entry point comes. EnableElasticsearchRepositories is need to activate elasticsearch repository. Since another repository is enabled, it is required to enable Jpa repository with EnableJpaRepositories.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@SpringBootApplication | |
@EnableElasticsearchRepositories | |
@EnableJpaRepositories("cookle.core.dao") | |
@ComponentScan({"cookle.essync.job", "cookle.crawler.model.domain"}) | |
@EntityScan({"cookle.crawler.model.domain","cookle.core.model.domain"}) | |
public class Mysql2ES implements CommandLineRunner { | |
@Autowired | |
private MysqlESSync mysqlESSync; | |
@Override | |
public void run(String... strings) throws Exception { | |
mysqlESSync.run(); | |
} | |
public static void main(String[] args) throws Exception { | |
SpringApplication.run(Mysql2ES.class).close(); | |
} | |
} |
Spring boot configures many details transparently. Spring data abstracts many internals from our views and makes life easier for us.
For complete listing on github see [2].
1. Spring Boot JPA Application
2. Github - essync
Comments
Post a Comment