千家信息网

Spring 4+ElasticSearch如何集成

发表于:2024-10-14 作者:千家信息网编辑
千家信息网最后更新 2024年10月14日,小编给大家分享一下Spring 4+ElasticSearch如何集成,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一:
千家信息网最后更新 2024年10月14日Spring 4+ElasticSearch如何集成

小编给大家分享一下Spring 4+ElasticSearch如何集成,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一: ElasticSearch 基本概念

INDEX:这是ES存储数据的地方,类似于关系数据库的DATABASE。


Document TYPE:嗯,类似关系数据库的表,主要功能是将完全不同SCHEMA(这个概念以后会讲到,不急)的数据分开,一个INDEX里面可以有若干个Document TYPE。


Document:好吧,这个类似关系数据库的一行,在同一个Document TYPE下面,每一Document都有一个唯一的ID作为区分;


Filed:类似关系数据库的某一列,这是ES数据存储的最小单位。


Cluster和Node:ES可以以单点或者集群方式运行,以一个整体对外提供search服务的所有节点组成cluster,组成这个cluster的各个节点叫做node。


shard:通常叫分片,这是ES提供分布式搜索的基础,其含义为将一个完整的INDEX分成若干部分存储在相同或不同的节点上,这些组成INDEX的部分就叫做shard。


Replica:和REPLICATION通常指的都是一回事,即INDEX的冗余备份,可以用于防止数据丢失,或者用来做负载分担。


二: ElasticSearch TransportClient和NodeClient

如果你使用Java,ElasticSearch 提供Transport CLIENT和Node CLIENT两种连接方式。transport CLIENT充当ES集群和你的应用直接的通信层,它知道API,并且能够在节点间自动轮循。


Node CLIENT,事实上是集群中的一个节点(但是不存储数据,并且不能作为主节点),由于它是一个节点,它知道整个集群的状态(全部节点都在哪,哪些分片在哪些节点上等等),这意味着它执行API时可以少用一个网络跳跃。


但需要完整的Node节点参数配置。


两种CLIENT的使用场景:


1.如果你想让你的应用和集群解耦,transport CLIENT是一个理想的选择。例如,如果你的集群快速创建和销毁连接,那么transport CLIENT比node CLIENT轻很多,因为它不是集群的一部分。


同样,如果你需要创建上千个连接,但是你不希望有上千个node CLIENT加入你的集群,transport CLIENT将是一个更好的选择。


2.在另一方面,如果你只需要几个长连接的,能持久的连接到集群,node CLIENT会更高效一点,因为它知道集群的结构,但是要注意防火墙影响相关通信的问题。


三:与Spring 集成


  1. @Configuration

  2. @PropertySource("classpath:context-datasource.properties")

  3. public class ElasticSearchElConfig {

  4. @Value("${el.cluster.name}")

  5. private String elClusterName;

  6. @Value("${el.cluster.node1.url}")

  7. private String elClusterNode1Url;

  8. @Value("${el.cluster.node1.port}")

  9. private Integer elClusterNode2Port;


  10. @Bean(name = "elasticSearchClient")

  11. public Client elasticSearchClient() {

  12. Map settimgMap = new HashMap();

  13. settimgMap.put("cluster.name", elClusterName);


  14. Settings settings = Settings.settingsBuilder().put(settimgMap).build();


  15. TransportClient client = TransportClient.builder().settings(settings).build()

  16. .addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress(elClusterNode1Url, elClusterNode2Port)));

  17. return client;


  18. }


  19. @Bean(name = "elasticTemplate")

  20. public ElasticsearchTemplate elasticTemplate(Client elasticSearchClient) {

  21. return new ElasticsearchTemplate(elasticSearchClient);

  22. }


  23. @Autowired

  24. private Environment environment;


  25. @Bean

  26. public static PropertySourcesPlaceholderConfigurer propertyConfigure() {

  27. return new PropertySourcesPlaceholderConfigurer();

  28. }

  29. }


四:Demo

文档类


点击(此处)折叠或打开

  1. @Document(indexName="gmap_system_log_index",type="gmap_system_log")

  2. public class Logs extends ValueObject{


  3. /**

  4. *

  5. */

  6. private static final long serialVersionUID = 1L;


  7. @Field(type=FieldType.Integer,index=FieldIndex.not_analyzed,store=true)

  8. private Integer userId;

  9. @Field(type=FieldType.String,index=FieldIndex.not_analyzed,store=true)

  10. private String system;

  11. @Field(type=FieldType.String,index=FieldIndex.not_analyzed,store=true)

  12. private String url;

  13. @Field(type=FieldType.String,index=FieldIndex.analyzed,store=true)

  14. private String content;

  15. /**

  16. * @return the userId

  17. */

  18. public Integer getUserId() {

  19. return userId;

  20. }

  21. /**

  22. * @param userId the userId to set

  23. */

  24. public void setUserId(Integer userId) {

  25. this.userId = userId;

  26. }

  27. /**

  28. * @return the system

  29. */

  30. public String getSystem() {

  31. return system;

  32. }

  33. /**

  34. * @param system the system to set

  35. */

  36. public void setSystem(String system) {

  37. this.system = system;

  38. }

  39. /**

  40. * @return the url

  41. */

  42. public String getUrl() {

  43. return url;

  44. }

  45. /**

  46. * @param url the url to set

  47. */

  48. public void setUrl(String url) {

  49. this.url = url;

  50. }

  51. /**

  52. * @return the content

  53. */

  54. public String getContent() {

  55. return content;

  56. }

  57. /**

  58. * @param content the content to set

  59. */

  60. public void setContent(String content) {

  61. this.content = content;

  62. }



  63. }


服务类


点击(此处)折叠或打开

  1. import java.util.ArrayList;

  2. import java.util.List;


  3. import org.springframework.beans.factory.annotation.Autowired;

  4. import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;

  5. import org.springframework.data.elasticsearch.core.query.IndexQuery;

  6. import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;

  7. import org.springframework.stereotype.Component;


  8. /**

  9. * TODO:

  10. *

  11. * @author gengchong

  12. * @date 2017年4月28日 下午4:24:01

  13. */

  14. @Component("elasticSearchDemo")

  15. public class ElasticSearchDemo {


  16. @Autowired

  17. private ElasticsearchTemplate elasticTemplate;


  18. /**

  19. * 创建索引

  20. */

  21. public void createGmapLogsIndex() {

  22. System.out.println(elasticTemplate.createIndex(Logs.class));

  23. }


  24. /**

  25. * 批量添加文档

  26. *

  27. * @param logs

  28. */

  29. public void createGmapLogs(List logs) {

  30. List queries = new ArrayList<>();

  31. for (Logs log : logs) {

  32. IndexQuery indexQuery = new IndexQueryBuilder().withObject(log).build();

  33. queries.add(indexQuery);

  34. }


  35. elasticTemplate.bulkIndex(queries);

  36. }


  37. /**

  38. * 添加文档

  39. *

  40. * @param log

  41. */

  42. public void createGmapLog(Logs log) {

  43. List logs = new ArrayList<>();

  44. logs.add(log);

  45. createGmapLogs(logs);

  46. }


  47. }

以上是"Spring 4+ElasticSearch如何集成"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0