Elasticsearch学习(6)—— Spring Data Elasticsearch

https://es.yemengying.com/html

使用SpringBoot整合Elasticsearch,通常都是使用 SpringData 进行封装的,而后在dao层接口继承ElasticsearchRepository 类,该类实现了不少的方法,好比经常使用的CRUD方法。node

首先,在使用以前,先作好相关的准备。web

1. 配置

1.1 Maven的配置

<dependency>spring

            <groupId>org.springframework.boot</groupId>数据库

            <artifactId>spring-boot-starter-web</artifactId>app

            <version>1.5.9.RELEASE</version>elasticsearch

</dependency>ide

<dependency>spring-boot

           <groupId>org.springframework.boot</groupId>测试

           <artifactId>spring-boot-starter-data-elasticsearch</artifactId>

           <version>1.5.9.RELEASE</version>

</dependency>

1.2 application.properties的配置 

spring.data.elasticsearch.repositories.enabled = true

spring.data.elasticsearch.cluster-nodes =127.0.0.1\:9300

【注】9300 是 Java 客户端的端口。9200 是支持 Restful HTTP 的接口。

更多的配置:

spring.data.elasticsearch.cluster-name Elasticsearch 集群名。(默认值: elasticsearch)

spring.data.elasticsearch.cluster-nodes 集群节点地址列表,用逗号分隔。若是没有指定,就启动一个客户端节点。

spring.data.elasticsearch.propertie 用来配置客户端的额外属性。

spring.data.elasticsearch.repositories.enabled 开启 Elasticsearch 仓库。(默认值:true。)

2. 实体类

@Document(indexName = "userindex", type = "user")

public class User implements Serializable{

    private static final long serialVersionUID = 1L;

    /** 编号 */

     private Long id;

     /** 姓名 */

     private String name;

     /** 年龄 */

     private Integer age;

     /** 描述 */  

     private String description;

     /** 建立时间 */

     private String createtm;

    // getter和setter 略

}    

【注】使用SpringData的时候,它须要在实体类中设置indexName 和type ,若是和传统型数据库比较的话,就至关于。须要注意的是indexNametype都必须是小写!!!

3. dao层

dao层这里就比较简单了,只需继承ElasticsearchRepository类就好了。其中主要的方法就是 save、delete和search。其中save方法至关如insert和update,没有就新增,有就覆盖。delete方法主要就是删除数据以及索引库。至于search就是查询了,包括一些经常使用的查询,如分页、权重之类的。

public interface UserDao extends ElasticsearchRepository<User, Long>{

}

 4. Service层

@Service

public class UserServiceImpl implements UserService {

    @Autowired

    private UserDao userDao;

    @Override

    public boolean insert(User user) {

        boolean falg=false;

        try{

            userDao.save(user);

            falg=true;

        }catch(Exception e){

            e.printStackTrace();

        }

        return falg;

    }

    @Override

    public List<User> search(String searchContent) {

          QueryStringQueryBuilder builder = new QueryStringQueryBuilder(searchContent);

          System.out.println("查询的语句:"+builder);

          Iterable<User> searchResult = userDao.search(builder);

          Iterator<User> iterator = searchResult.iterator();

          List<User> list=new ArrayList<User>();

          while (iterator.hasNext()) {

            list.add(iterator.next());

          }

       return list;

    }

    @Override

    public List<User> searchUser(Integer pageNumber, Integer pageSize,String searchContent) {

         // 分页参数

        Pageable pageable = new PageRequest(pageNumber, pageSize);

        QueryStringQueryBuilder builder = new QueryStringQueryBuilder(searchContent);

        SearchQuery searchQuery = new NativeSearchQueryBuilder().withPageable(pageable).withQuery(builder).build();

        System.out.println("查询的语句:" + searchQuery.getQuery().toString());

        Page<User> searchPageResults = userDao.search(searchQuery);

        return searchPageResults.getContent();

    }

    @Override

    public List<User> searchUserByWeight(String searchContent) {

     // 根据权重进行查询

        FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()

                .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("name", searchContent)),

                    ScoreFunctionBuilders.weightFactorFunction(10))

                .add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("description", searchContent)),

                        ScoreFunctionBuilders.weightFactorFunction(100)).setMinScore(2);

        System.out.println("查询的语句:" + functionScoreQueryBuilder.toString());

        Iterable<User> searchResult = userDao.search(functionScoreQueryBuilder);

        Iterator<User> iterator = searchResult.iterator();

        List<User> list=new ArrayList<User>();

        while (iterator.hasNext()) {

            list.add(iterator.next());

        }

        return list;

    }

以后能够对实现进行测试 。

此外,还能够使用Jest Client调用Elasticsearch 的API。

相关文章
相关标签/搜索