Spring Boot系列(十)Spring Boot整合Elasticsearch全文搜索引擎

Elastic Search是一个开源的,分布式,实时搜索和分析引擎。Spring Boot为Elasticsearch及Spring 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.bootgroupId>
   <artifactId>spring-boot-starter-data-elasticsearchartifactId>
dependency>


可以像其他Spring beans那样注入一个自动配置的ElasticsearchTemplate或Elasticsearch客户端实例。默认情况下,该实例将尝试连接到一个本地内存服务器(在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 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 getTags() {
       return tags;
}
   public void setTags(List 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 findByTagsName(String name, Pageable pageable);
}


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


public interface PostService {
   Post save(Post post);
   Post findOne(String id);
   Iterable findAll();
   Page 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 findAll() {
       return postRepository.findAll();
  }
   @Overridepublic Page 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 posts  = postService.findByTagsName("tech", new PageRequest(0,10));
   Page posts2  = postService.findByTagsName("tech", new PageRequest(0,10));
   Page posts3  = postService.findByTagsName("maz", new PageRequest(0,10));
   assertThat(posts.getTotalElements(), is(1L));
   assertThat(posts2.getTotalElements(), is(1L));
   assertThat(posts3.getTotalElements(), is(0L));
}


来源:素文宅博客

链接:https://blog.yoodb.com/yoodb/article/detail/1412

你可能感兴趣的:(java,springboot)