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。

相關文章
相關標籤/搜索