Java Elasticsearch创建索引
生活随笔
收集整理的這篇文章主要介紹了
Java Elasticsearch创建索引
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1,新建一個es的項目。
2,導入依賴Elasticsearch
3,配置文件
spring:data:elasticsearch:cluster-name: elasticsearch #集群名字cluster-nodes: 192.168.84.130:9300 #elasticsearch服務器ip地址jackson:default-property-inclusion: non_null #作用:當返回數據為null:如name:null ,此時不會顯示到頁面上來。4,編寫pojo
@Document(indexName = "item",//索引名字一定要小寫,否則啟動會出錯:“InvalidIndexNameException[Invalid index name [Item], must be lowercase”type = "docs",shards = 1,//默認5replicas = 0//默認1 ) public class Item {@IdLong id;@Field(type = FieldType.Text,analyzer = "ik_max_word")String title;@Field(type = FieldType.Keyword)String category;@Field(type = FieldType.Keyword)String brand;@Field(type = FieldType.Double)Double price;@Field(type = FieldType.Keyword,index = false)String images;public Item(Long id, String title, String category, String brand, Double price, String images) {this.id = id;this.title = title;this.category = category;this.brand = brand;this.price = price;this.images = images;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getCategory() {return category;}public void setCategory(String category) {this.category = category;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}public String getImages() {return images;}public void setImages(String images) {this.images = images;} }5,創建索引和映射
@SpringBootTest @RunWith(SpringRunner.class) public class ElasticsearchTest {@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@Testpublic void testCreate(){this.elasticsearchTemplate.createIndex(Item.class);//創建索引this.elasticsearchTemplate.putMapping(Item.class);//創建映射} }6,刪除索引
@Testpublic void deleteIndex(){this.elasticsearchTemplate.deleteIndex("item");//刪除索引}7,對索引庫中數據CRUD
對索引庫中數據CRUD不用寫dao處理,會自動根據方法名或者類的信息進行CRUD操作,只要定義一個接口并繼承Respository提供的子接口。
實現接口:Respository
import cn.ly.elasticsearch.pojo.Item; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface ItemRespository extends ElasticsearchRepository<Item,Long> { }7.1,a-新增數據:save()
@Testpublic void testInsert(){Item item=new Item(1L,"華為筆記本","電腦","華為",998.9,"http://huawei.ccm.111.png");this.itemRespository.save(item);}?
b-批量新增:savell()
@Testpublic void testInsert1(){Item item1=new Item(4L,"小米1","電腦3","小米",1998.9,"http://huawei.ccm.111.png");Item item2=new Item(4L,"小米2","是手32","小米",1998.9,"http://huawei.ccm.111.png");Item item3=new Item(4L,"小蝦米","3到","小米",1998.9,"http://huawei.ccm.111.png");Item item4=new Item(4L,"小快看","電腦3","小米",1998.9,"http://huawei.ccm.111.png");List<Item> list=new ArrayList<>();list.add(item1);list.add(item2);list.add(item3);list.add(item4);this.itemRespository.saveAll(list);}?
7.2,update
?當save的時候,當id相同,就會update。
@Testpublic void testInsert(){Item item=new Item(1L,"華為筆記本2","電腦2","華為",998.9,"http://huawei.ccm.111.png");this.itemRespository.save(item);}7.3,delete
@Testpublic void testDelete(){this.itemRespository.deleteById(1L);}8,Search
@Testpublic void testSearch(){Optional<Item> itemOptional = this.itemRespository.findById(2L);//按id查詢Item item = itemOptional.get();System.out.println(item);} @Testpublic void testSearch2(){Iterable<Item> allitem = this.itemRespository.findAll();//查詢所有allitem.forEach(item -> System.out.println(item));}8.1,自定義方法
只需要在編寫的接口中根據名字模板,編寫方法即可使用。
import cn.ly.elasticsearch.pojo.Item; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface ItemRespository extends ElasticsearchRepository<Item,Long> {//自定義查詢方法,該方法名字需要遵循一定的規則,看下表public Item findByTitleAndPrice(String title,double price);//findByNameAndPrice(); } @Testpublic void testSearch3(){Item item = this.itemRespository.findByTitleAndPrice("華為筆記本2", 2998.9);System.out.println(item);}方法名稱中受支持的關鍵字:(https://docs.spring.io/spring-data/elasticsearch/docs/3.2.3.RELEASE/reference/html/#reference)
?
8.2,search查詢
QueryBuilders
@Testpublic void testSearch4(){//通過查詢構造器構建查詢條件MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "華為");//執行查詢Iterable<Item> items = this.itemRespository.search(matchQueryBuilder);items.forEach(item -> System.out.println(item));}?
NativeSearchQueryBuilder?
@Testpublic void testSearch5(){//構造器NativeSearchQueryBuilder nativeSearchQueryBuilder =new NativeSearchQueryBuilder();//構建基本條件nativeSearchQueryBuilder.withQuery( QueryBuilders.matchQuery("title", "華為"));//執行Page<Item> items = this.itemRespository.search(nativeSearchQueryBuilder.build());//執行查詢items.forEach(item -> System.out.println(item));}NativeSearchQueryBuilder?
@Testpublic void testSearch6(){//構造器NativeSearchQueryBuilder nativeSearchQueryBuilder =new NativeSearchQueryBuilder();//構建基本條件,查詢匹配條件的數據nativeSearchQueryBuilder.withQuery( QueryBuilders.matchQuery("title", "華為"));//Pageable的實現類PageRequest//添加分頁條件,頁碼從0開始。nativeSearchQueryBuilder.withPageable(PageRequest.of(0,2));//添加排序條件//SortBuilder子類FieldSortBuilderFieldSortBuilder price = SortBuilders.fieldSort("price").order(SortOrder.DESC);nativeSearchQueryBuilder.withSort(price);//執行Page<Item> items = this.itemRespository.search(nativeSearchQueryBuilder.build());//執行查詢items.forEach(item -> System.out.println(item));}?
9,聚合
/*** 獲取所有標牌名字的平均價格*/@Testpublic void testSearch7(){//構造器NativeSearchQueryBuilder nativeSearchQueryBuilder =new NativeSearchQueryBuilder();//構建基本條件,查詢匹配條件的數據//nativeSearchQueryBuilder.withQuery( QueryBuilders.matchQuery("title", "華為"));//條件0,獲取標牌名字為華為的條件的平均價格TermsAggregationBuilder aggs = AggregationBuilders.terms("agg_brand").field("brand")//條件1.subAggregation(AggregationBuilders.avg("agg_price").field("price"));//條件2 // AbstractAggregationBuilder的子類為TermsAggregationBuildernativeSearchQueryBuilder.addAggregation(aggs);// 添加聚合 // SourceFilter 的子類FetchSourceFilter:添加結果集過濾FetchSourceFilter fetchSourceFilter = new FetchSourceFilter(null, null);//String[] includes,是否包含某些字段 String[] excludes是否排除某些字段nativeSearchQueryBuilder.withSourceFilter(fetchSourceFilter);//添加結果集過濾,不包含任何字段//執行 // Page的子類AggregatedPage//執行查詢AggregatedPage<Item> aggregatedPage =(AggregatedPage<Item>) this.itemRespository.search(nativeSearchQueryBuilder.build());StringTerms st=(StringTerms)aggregatedPage.getAggregation("agg_brand");//可以根據桶名字獲取所有的桶 // 獲取桶的集合List<StringTerms.Bucket> buckets = st.getBuckets();buckets.forEach(bucket ->{System.out.println(bucket.getDocCount());System.out.println(bucket.getKeyAsString());Map<String, Aggregation> stringAggregationMap = bucket.getAggregations().asMap();//獲取子集的map集合InternalAvg price_avg =(InternalAvg)stringAggregationMap.get("agg_price");// System.out.println(price_avg);//對象System.out.println(price_avg.getValue());});}?
總結
以上是生活随笔為你收集整理的Java Elasticsearch创建索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux中修改mysql排序规则_My
- 下一篇: 使用bat脚本完成关机、滑动关机和重启