? ? ? ? ? ? SpringDataElasticsearch 提供了一個工具類 ElasticsearchTemplate,我們使用該類對象也可以對 ES 進行操作
1.操作索引
首先注入操作ES所需要的工具類(ElasticsearchTemplate)。
@Autowiredprivate ElasticsearchTemplate template;
將createIndex改為false
@Document(indexName = "product",createIndex = false)
@Data
@AllArgsConstructor
public class Product {@Id //標記在成員變量上,標記一個字段為主鍵,該字段的值會同步到ES該文檔的id值//標記在成員變量上,標記為文檔中的域,一般有如下屬性-> type域的類型,index是否創建索引,store是否單獨存儲,analyzer分詞器,searchAnalyzer搜索分詞器@Field(type = FieldType.Integer,store = true,index = true)private Integer id;@Field(type = FieldType.Text,store = true,index = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")private String productName;@Field(type = FieldType.Text,store = true,index = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")private String productDesc;
}
1.1新增索引(不推薦)
不推薦原因:生成的索引中mappings為空,并不按照指定
@Testpublic void addIndex(){//獲取索引操作對象IndexOperations indexOperations = template.indexOps(Product.class);//創建索引indexOperations.create();}
1.2刪除索引
@Testpublic void deleteIndex(){//獲取索引操作對象IndexOperations indexOperations = template.indexOps(Product.class);//刪除索引indexOperations.delete();}
2.操作文檔
?2.1新增/修改 文檔??
//新增/修改 文檔@Testpublic void addDocument(){Product product = new Product(5, "elasticsearch", "elasticsearch是一款非常好的分詞器");template.save(product);}
2.2刪除文檔
@Testpublic void deleteDocument(){template.delete("5",Product.class);}
2.3查詢文檔
//根據id查詢
@Testpublic void findDocument(){Product product = template.get("1", Product.class);System.out.println(product);}
3.查詢文檔
template的search方法可以查詢文檔
SearchHits < T > search ( Query query , Class < T > clazz ) :查詢文檔, query 是查詢條件對象, clazz 是結果類型。
3.1簡單查詢
@Testpublic void findDocuments(){//1.構造查詢條件NativeQuery query=new NativeQueryBuilder().withQuery(Queries.matchAllQueryAsQuery()).build();//2.查詢SearchHits<Product> result = template.search(query, Product.class);//3.處理查詢結果for (SearchHit<Product> productSearchHit : result) {System.out.println(productSearchHit.getContent());}}
3.2匹配查詢
@Testpublic void findDocuments(){//1.構造查詢條件NativeQuery query=new NativeQueryBuilder().withQuery(Queries.matchQueryAsQuery("productDesc","手機",null,null)).build();//2.查詢SearchHits<Product> result = template.search(query, Product.class);//3.處理查詢結果for (SearchHit<Product> productSearchHit : result) {System.out.println(productSearchHit.getContent());}}
4.復雜條件查詢
@Testpublic void findDocuments2(){String productName="三體";String productDesc="小說";//1.構造查詢條件NativeQueryBuilder nativeQueryBuilder = new NativeQueryBuilder();//判斷是否有查詢條件if (productName== null && productDesc== null){//查詢所有nativeQueryBuilder.withQuery(Queries.matchAllQueryAsQuery());}else {//構造bool查詢BoolQuery.Builder boolQuery = QueryBuilders.bool();if (productName!=null){//構造must條件boolQuery.must(Queries.matchQueryAsQuery("productName",productName,null,null));}if (productDesc!=null){boolQuery.must(Queries.matchQueryAsQuery("productDesc",productDesc,null,null));}//構造查詢條件nativeQueryBuilder.withQuery(boolQuery.build()._toQuery());}//構造查詢條件NativeQuery query = nativeQueryBuilder.build();//2.查詢SearchHits<Product> result = template.search(query, Product.class);//3.處理查詢結果for (SearchHit<Product> productSearchHit : result) {System.out.println(productSearchHit.getContent());}}
5.分頁查詢
@Testpublic void findDocuments3(){//1.構造查詢條件//分頁條件Pageable pageable = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "id"));NativeQuery query=new NativeQueryBuilder().withQuery(Queries.matchAllQueryAsQuery()).withPageable(pageable).build();//2.查詢SearchHits<Product> result = template.search(query, Product.class);//3.處理查詢結果ArrayList content = new ArrayList();for (SearchHit<Product> productSearchHit : result) {content.add(productSearchHit.getContent());}/***封裝page對象* 參數1:具體數據 參數2:分頁條件對象 參數3:總條數*/Page<PageImpl> page = new PageImpl(content, pageable, result.getTotalHits());System.out.println(page.getTotalElements());System.out.println(page.getTotalPages());System.out.println(page.getContent());}
6.結果排序
@Testpublic void findDocumentSort(){//1.構造查詢條件NativeQuery query=new NativeQueryBuilder().withQuery(Queries.matchAllQueryAsQuery())//Sort.Direction.DESC 降序 Sort.Direction.ASC 升序.withSort(Sort.by(Sort.Direction.DESC,"id")).build();//2.查詢SearchHits<Product> result = template.search(query, Product.class);//3.處理查詢結果for (SearchHit<Product> productSearchHit : result) {System.out.println(productSearchHit.getContent());}}