Elastic Search是一个开源的,分布式,实时搜索和分析引擎。Spring BootElasticsearchSpring Data Elasticsearch提供的基于它的抽象提供了基本的配置。Spring Boot提供了一个用于聚集依赖的spring-boot-starter-data-elasticsearch 'StarterPOM'

引入spring-boot-starter-data-elasticsearch依赖,在pom.xml配置文件中增加如下内容(基于之前章节“Spring Boot 构建框架”中的pom.xml文件):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

可以像其他Spring beans那样注入一个自动配置的ElasticsearchTemplateElasticsearch客户端实例。默认情况下,该实例将尝试连接到一个本地内存服务器(在Elasticsearch项目中的一个NodeClient),但可以通过设置spring.data.elasticsearch.clusterNodes为一个以逗号分割的host:port列表来将其切换到一个远程服务器(比如,TransportClient)。

@Component
public class MyBean {
    private ElasticsearchTemplate template;
    
    @Autowired
    public MyBean(ElasticsearchTemplate template) {
this.template = template;
    }
    // ...
}

如果添加一个自己的ElasticsearchTemplate类型的@Bean,它将替换默认的。

应用集成ElasticSearch案例

新建elasticsearch.properties配置文件,添加如下配置内容:

elasticsearch.host=localhost
elasticsearch.port=9300

ElasticSearch配置,读取elasticsearch.properties配置文件信息,具体代码如下:

@Configuration@PropertySource(value = "classpath:elasticsearch.properties")
@EnableElasticsearchRepositories(basePackages = "co.paan.repository")
public class ElasticsearchConfiguration {
    @Resource
private Environment environment;
@Bean
public Client client() {
TransportClient client = new TransportClient();
TransportAddress address = new InetSocketTransportAddress(environment.getProperty("elasticsearch.host"), Integer.parseInt(environment.getProperty("elasticsearch.port")));
client.addTransportAddress(address);
return client;
}
    @Beanpublic ElasticsearchOperations elasticsearchTemplate() {
return new ElasticsearchTemplate(client());
    }
}

两个实体类,具体代码如下:

@Document(indexName = "post", type = "post", shards = 1, replicas = 0)
public class Post {
@Id
private String id;
    private String title;
@Field(type= FieldType.Nested)
private List<Tag> tags;   
 public String getId() {
return id;
}
    public void setId(String id) {
this.id = id;
}
    public String getTitle() {
return title;
}
    public void setTitle(String title) {
this.title = title;
}
    public List<Tag> getTags() {
return tags;
}
    public void setTags(List<Tag> tags) {
this.tags = tags;
}
}
public class Tag {
private String id;   
private String name;   
public String getId() {
return id;
    }
    public void setId(String id) {
this.id = id;
    }
    public String getName() {
return name;
    }
    public void setName(String name) {
this.name = name;
    }
}

数据源继承ElasticsearchRepository类,封装接口代码如下:

public interface PostRepository extends ElasticsearchRepository<Post, String>{
    Page<Post> findByTagsName(String name, Pageable pageable);
}

数据服务接口及实现类,代码如下:

public interface PostService {
    Post save(Post post);
    Post findOne(String id);
    Iterable<Post> findAll();
    Page<Post> findByTagsName(String tagName, PageRequest pageRequest);
}
@Servicepublic class PostServiceImpl implements PostService{
    @Autowired
private PostRepository postRepository;
@Override
public Post save(Post post) {
postRepository.save(post);
      return post;
       }
    @Overridepublic Post findOne(String id) {
return postRepository.findOne(id);
   }
    @Overridepublic Iterable<Post> findAll() {
return postRepository.findAll();
   }
    @Overridepublic Page<Post> findByTagsName(String tagName, PageRequest pageRequest) {
return postRepository.findByTagsName(tagName, pageRequest);
   }
}

测试代码如下:

@Test
public void testFindByTagsName() throws Exception {
    Tag tag = new Tag();
    tag.setId("1");
    tag.setName("tech");
    Tag tag2 = new Tag();
    tag2.setId("2");
    tag2.setName("elasticsearch");
    Post post = new Post();
    post.setId("1");
    post.setTitle("Bigining with spring boot application and elasticsearch");
    post.setTags(Arrays.asList(tag, tag2));
    postService.save(post);
    Post post2 = new Post();
    post2.setId("1");
    post2.setTitle("Bigining with spring boot application");
    post2.setTags(Arrays.asList(tag));
    postService.save(post);
    Page<Post> posts  = postService.findByTagsName("tech", new PageRequest(0,10));
    Page<Post> posts2  = postService.findByTagsName("tech", new PageRequest(0,10));
    Page<Post> posts3  = postService.findByTagsName("maz", new PageRequest(0,10));
    assertThat(posts.getTotalElements(), is(1L));
    assertThat(posts2.getTotalElements(), is(1L));
    assertThat(posts3.getTotalElements(), is(0L));
}

关注下方微信公众号“Java精选”(w_z90110),回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。

Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。

评论

  1. #1

    踩踩踩踩踩 (2017/11/29 18:49:21)回复
    TransportClient client = new TransportClient();无法new

    路人甲 (2017/11/30 13:04:29)回复
    版本不同导致无法new对象,你修改一下版本号,试一试应该可以的。

分享:

支付宝

微信