1 Star 4 Fork 2

xcc / my-cloud

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
ItemTest.java 14.57 KB
一键复制 编辑 原始数据 按行查看 历史
xcc 提交于 2021-02-03 23:09 . 添加聚合和高亮
package com.xcc.cloud.es;
import com.xcc.cloud.es.entity.Item;
import net.minidev.json.JSONArray;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.*;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedLongTerms;
import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.support.ValueType;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import org.springframework.data.elasticsearch.core.query.*;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@RunWith(value = SpringRunner.class)
@SpringBootTest(classes = CloudESApplication.class)
public class ItemTest {
/**
* ElasticsearchTemplate是在es5.x使用
* ElasticsearchRestTemplate是在es6.5之后使用
*/
/*@Autowired
ElasticsearchTemplate elasticsearchTemplate;*/
@Autowired
ElasticsearchRestTemplate elasticsearchRestTemplate;
@Test
public void testCreateIndex() {
boolean index = elasticsearchRestTemplate.createIndex(Item.class);
System.out.println("创建索引是否成功:" + index);
}
@Test
public void testCreateMapping() {
boolean index = elasticsearchRestTemplate.createIndex(Item.class);
System.out.println("创建索引是否成功:" + index);
boolean mapping = elasticsearchRestTemplate.putMapping(Item.class);
System.out.println("为索引创建映射是否成功:" + mapping);
}
@Test
public void testDeleteIndex() {
boolean index = elasticsearchRestTemplate.deleteIndex(Item.class);
System.out.println("删除索引是否成功:" + index);
}
@Test
public void testInsertObject() {
Item item = new Item();
item.setId("123");
item.setNum(222);
item.setPrice(333L);
item.setSellPoint("sellpoint222");
item.setTitle("my_title1111");
IndexQuery indexQuery = new IndexQuery();
indexQuery.setObject(item);
String result = elasticsearchRestTemplate.index(indexQuery);
System.out.println(result);
}
/**
* 测试批量插入数据
*/
@Test
public void testBulkInsert() {
List<IndexQuery> bulkIndexs = new ArrayList<>();
Item item0 = new Item();
item0.setId("20210201");
item0.setNum(999);
item0.setPrice(1999L);
item0.setSellPoint("红米Note9Pro,1亿像素你值得拥有。");
item0.setTitle("红米Note9Pro 5G 8+256");
Item item1 = new Item();
item1.setId("20210202");
item1.setNum(888);
item1.setPrice(2999L);
item1.setSellPoint("华为荣耀30,麒麟985,荣耀使用麒麟芯片的最后一部手机,卖一部少一部!");
item1.setTitle("华为荣耀30 5G");
Item item2 = new Item();
item2.setId("20210203");
item2.setNum(777);
item2.setPrice(5999L);
item2.setSellPoint("华为Mate40,像素高,为你照亮夜空中的月亮。");
item2.setTitle("华为Mate40 5G");
bulkIndexs.add(new IndexQueryBuilder().withObject(item0).build());
bulkIndexs.add(new IndexQueryBuilder().withObject(item1).build());
bulkIndexs.add(new IndexQueryBuilder().withObject(item2).build());
elasticsearchRestTemplate.bulkIndex(bulkIndexs);
}
/**
* 测试删除数据
*/
@Test
public void testDeleteDocument() {
DeleteQuery deleteQuery = new DeleteQuery();
/*deleteQuery.setIndex("ego_item");
deleteQuery.setType("item");*/
deleteQuery.setQuery(QueryBuilders.matchQuery("id", "20210203"));
elasticsearchRestTemplate.delete(deleteQuery, Item.class);
}
/**
* 测试修改某个字段
*/
@Test
public void testUpdate() throws IOException {
UpdateRequest request = new UpdateRequest();
request.doc(
XContentFactory.jsonBuilder()
.startObject()
.field("name", "测试update更新数据,商品名称")
.endObject()
);
UpdateQuery updateQuery = new UpdateQueryBuilder()
.withId("123")
.withClass(Item.class)
.withUpdateRequest(request)
.build();
elasticsearchRestTemplate.update(updateQuery);
}
/**
* 模糊搜索:匹配所有的字段
*/
@Test
public void query() {
SearchQuery query = new NativeSearchQuery(
QueryBuilders.queryStringQuery("华为")
);
List<Item> items = elasticsearchRestTemplate.queryForList(query, Item.class);
for (Item item : items) {
System.out.println(item);
}
}
/**
* match_all匹配
*/
@Test
public void testMatchAll() {
SearchQuery query = new NativeSearchQuery(
QueryBuilders.matchAllQuery()
);
List<Item> items = elasticsearchRestTemplate.queryForList(query, Item.class);
for (Item item : items) {
System.out.println(item);
}
}
/**
* match:对查询的值进行分词,只要数据集中对应字段 包含 查询的值(分词后所有的值)即可,根据boost从高到低
*/
@Test
public void testMatch() {
SearchQuery query = new NativeSearchQuery(
QueryBuilders.matchQuery("title", "华为荣耀")
);
List<Item> items = elasticsearchRestTemplate.queryForList(query, Item.class);
for (Item item : items) {
System.out.println(item);
}
}
/**
* match_phrase:对查询的值进行分词,需要数据集中对应字段分词后 顺序 与查询的值完全匹配
*/
@Test
public void testMatchPhrase() {
SearchQuery query = new NativeSearchQuery(
QueryBuilders.matchPhraseQuery("title", "华为荣耀")
);
List<Item> items = elasticsearchRestTemplate.queryForList(query, Item.class);
for (Item item : items) {
System.out.println(item);
}
}
/**
* term:对查询的值不分词,需要数据集中对应字段分词后 包含 当前值(不分词的值)
*/
@Test
public void testTerm() {
SearchQuery query = new NativeSearchQuery(
QueryBuilders.termQuery("title", "荣耀")
);
List<Item> items = elasticsearchRestTemplate.queryForList(query, Item.class);
for (Item item : items) {
System.out.println(item);
}
}
/**
* 范围查询
*/
@Test
public void testRange() {
SearchQuery query = new NativeSearchQuery(
QueryBuilders.rangeQuery("price")
.gte(1999).lt(5999)
);
List<Item> items = elasticsearchRestTemplate.queryForList(query, Item.class);
for (Item item : items) {
System.out.println(item);
}
}
/**
* 多条件查询
*/
@Test
public void testManyBool() {
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
boolQueryBuilder.must(QueryBuilders.termQuery("title", "华为"))
.must(QueryBuilders.rangeQuery("price").gte(3000));
SearchQuery query = new NativeSearchQuery(boolQueryBuilder);
List<Item> items = elasticsearchRestTemplate.queryForList(query, Item.class);
for (Item item : items) {
System.out.println(item);
}
}
/**
* 分页排序搜索
*/
@Test
public void pageSort() {
NativeSearchQuery query = new NativeSearchQuery(
QueryBuilders.matchAllQuery()
);
query.addSort(Sort.by(Sort.Direction.DESC,"price"));
query.setPageable(PageRequest.of(1,2));
List<Item> items = elasticsearchRestTemplate.queryForList(query, Item.class);
for (Item item : items) {
System.out.println(item);
}
}
/**
* 高亮
*/
@Test
public void testHighlight(){
HighlightBuilder.Field field = new HighlightBuilder.Field("title")
//默认20个字 默认为5
.fragmentSize(10).numOfFragments(3);
field.preTags("<a>").postTags("</a>");
SearchQuery query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("title", "华为荣耀"))
.withHighlightFields(field)
.withPageable(PageRequest.of(0, 2))
.build();
AggregatedPage<Item> aggregatedPage = elasticsearchRestTemplate.queryForPage(query, Item.class, new SearchResultMapper() {
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
SearchHit[] hits = searchResponse.getHits().getHits();
List<Item> items = new ArrayList<>();
for (SearchHit hit : hits) {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
Item item = new Item();
item.setId(sourceAsMap.get("id").toString());
// item.setTitle(sourceAsMap.get("title").toString());
item.setSellPoint(sourceAsMap.get("sellPoint").toString());
item.setPrice(Long.parseLong(sourceAsMap.get("price").toString()));
item.setNum(Integer.parseInt(sourceAsMap.get("num").toString()));
//设置高亮返回
item.setTitle(hit.getHighlightFields().get("title").getFragments()[0].toString());
items.add(item);
}
// AggregatedPageImpl<Item> aggregatedPage = new AggregatedPageImpl<Item>(items);
return new AggregatedPageImpl<T>((List<T>) items,pageable,searchResponse.getHits().getTotalHits());
}
@Override
public <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {
return null;
}
});
for (Item item : aggregatedPage.getContent()) {
System.out.println(item);
}
}
/**
* 聚合处理
* GET ego_item/_search
* {
* "query": {
* "match_all": {}
* },
* "aggs": {
* "agg_price": {
* "terms": {
* "field": "price",
* "size": 10
* }
* },
* "agg_num": {
* "terms": {
* "field": "num",
* "size": 10
* }
* }
* }
* }
*/
@Test
public void testAgg() {
TermsAggregationBuilder price = AggregationBuilders.terms("agg_price").field("price").size(10);
TermsAggregationBuilder num = AggregationBuilders.terms("agg_num").field("num").size(10);
SearchQuery queryBuilder = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchAllQuery())
.addAggregation(price)
.addAggregation(num)
.build();
AggregatedPage<Item> aggregatedPage = elasticsearchRestTemplate.queryForPage(queryBuilder, Item.class, new SearchResultMapper() {
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
SearchHit[] hits = searchResponse.getHits().getHits();
List<Item> items = new ArrayList<>();
for (SearchHit hit : hits) {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
Item item = new Item();
item.setId(sourceAsMap.get("id").toString());
item.setTitle(sourceAsMap.get("title").toString());
item.setSellPoint(sourceAsMap.get("sellPoint").toString());
item.setPrice(Long.parseLong(sourceAsMap.get("price").toString()));
item.setNum(Integer.parseInt(sourceAsMap.get("num").toString()));
items.add(item);
}
Aggregations aggregations = searchResponse.getAggregations();
/*Map<String,Object> map = (Map)aggregations.get("agg_price").getMetaData().get("buckets");
System.out.println(map);
Map<String,Object> map1 = (Map)aggregations.get("agg_num").getMetaData().get("buckets");
System.out.println(map1);*/
return new AggregatedPageImpl<T>((List<T>) items, pageable, searchResponse.getHits().getTotalHits(), aggregations);
}
@Override
public <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {
return null;
}
});
Map<String, Aggregation> asMap = aggregatedPage.getAggregations().asMap();
ParsedLongTerms agg_price = (ParsedLongTerms) asMap.get("agg_price");
ParsedLongTerms agg_num = (ParsedLongTerms) asMap.get("agg_num");
System.out.println("===========agg_price============");
for (Terms.Bucket bucket : agg_price.getBuckets()) {
System.out.println(bucket.getKey()+"\t"+bucket.getDocCount());
}
System.out.println("===========agg_num============");
for (Terms.Bucket bucket : agg_num.getBuckets()) {
System.out.println(bucket.getKey()+"\t"+bucket.getDocCount());
}
for (Item item : aggregatedPage.getContent()) {
System.out.println(item);
}
}
}
Java
1
https://gitee.com/xiaocheng0902/my-cloud.git
git@gitee.com:xiaocheng0902/my-cloud.git
xiaocheng0902
my-cloud
my-cloud
master

搜索帮助