@RunWith(SpringRunner.class)
@SpringBootTest(classes= { Demo01Application.class})public classDemo01ApplicationTests {
@AutowiredprivateRestHighLevelClient client;public static String INDEX_TEST = null;public static String TYPE_TEST = null;public static Tests tests = null;public static List testsList = null;
@Testpublic void contextLoads() throwsIOException, CloneNotSupportedException {// //判断是否存在索引//existsIndex("indexName");// //创建索引//createIndex("house", "house-info");// //删除索引//deleteIndex("house");// //判断数据是否存在//exists("user", "user-info", "JO3hP24BlvWqEof7y5BF");// //根据ID获取数据//get("index01", "type", "201");//
//List idList = null;//List> dataList = null;// // //批量更新//bulkUpdate("index_name", "index_type", idList, dataList);// //批量添加//bulkAdd("index_name", "index_type", idList, dataList);// //批量删除//List> dataList = null;//List idList = new ArrayList();//idList.add("ZsSfRW4B3jWdK-k5x4lo");//idList.add("ZcSZRW4B3jWdK-k5E4ld");//bulkDelete("user", "user-info", idList, dataList);//
// //坐标范围查询//searchPoint();// //关键字查询//search("蒋", "user-info", "user");
client.close();
}/*** 创建索引
*
*@paramindex_name
*@paramindex_type
*@throwsIOException*/
private void createIndex(String index_name, String index_type) throwsIOException {
CreateIndexRequest request= new CreateIndexRequest(index_name);//创建索引//创建的每个索引都可以有与之关联的特定设置===================设置主片与副本数======================//主片的个数(默认5个)确定是不会变的,副本数(默认1个)是可以改变的
request.settings(Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 1));
XContentBuilder xContentBuilder=XContentFactory.jsonBuilder();
xContentBuilder.startObject()//索引库名(类似数据库中的表),可以指定字段的类型,String中text是分词的,keyword不分词
.startObject(index_type).startObject("properties")
.startObject("doc.haCode").field("type", "keyword").endObject()
.startObject("doc.haStatus").field("type", "integer").field("index", false).endObject()
.startObject("doc.haName").field("type", "text").endObject()
.startObject("doc.haAddr").field("type", "text").endObject()
.startObject("doc.haPrice").field("type", "float").field("index", false).endObject()
.startObject("doc.location").field("type", "geo_point").endObject()//不参与索引创建
.startObject("doc.haImage").field("type", "text").field("index", false).endObject()
.startObject("doc.haDate").field("type", "date").endObject()
.endObject().endObject().endObject();//创建索引时创建文档类型映射==========================定义mapping,指定字段类型,如一些特殊字段=========================
request.mapping(index_type, xContentBuilder);//异步执行//异步执行创建索引请求需要将CreateIndexRequest实例和ActionListener实例传递给异步方法://CreateIndexResponse的典型监听器如下所示://异步方法不会阻塞并立即返回。
ActionListener listener = new ActionListener() {
@Overridepublic voidonResponse(CreateIndexResponse createIndexResponse) {//如果执行成功,则调用onResponse方法;
}
@Overridepublic voidonFailure(Exception e) {//如果失败,则调用onFailure方法。
}
};
CreateIndexResponse createIndexResponse=client.indices().create(request, RequestOptions.DEFAULT);
System.out.println("createIndex: " +JSON.toJSONString(createIndexResponse));
xContentBuilder.close();//client.indices().createAsync(request, RequestOptions.DEFAULT,//listener);//要执行的CreateIndexRequest和执行完成时要使用的ActionListener
}/*** 判断索引是否存在
*
*@paramindex_name
*@return*@throwsIOException*/
public boolean existsIndex(String index_name) throwsIOException {
GetIndexRequest request= newGetIndexRequest();
request.indices(index_name);boolean exists =client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println("existsIndex: " +exists);returnexists;
}/*** 删除索引
*
*@paramindex
*@return*@throwsIOException*/
public void deleteIndex(String index_name) throwsIOException {
DeleteIndexRequest request= newDeleteIndexRequest(index_name);
DeleteIndexResponse deleteIndexResponse=client.indices().delete(request, RequestOptions.DEFAULT);
System.out.println("deleteIndex: " +JSON.toJSONString(deleteIndexResponse));
}/*** 判断记录是否存在
*
*@paramindex
*@paramtype
*@paramtests
*@return*@throwsIOException*/
public boolean exists(String index_name, String index_type, String index_id) throwsIOException {
GetRequest getRequest= newGetRequest(index_name, index_type, index_id);
getRequest.fetchSourceContext(new FetchSourceContext(false));
getRequest.storedFields("_none_");boolean exists =client.exists(getRequest, RequestOptions.DEFAULT);
System.out.println("exists: " +exists);returnexists;
}/*** 根据ID获取记录信息
*
*@paramindex
*@paramtype
*@paramid
*@throwsIOException*/
public void get(String index_name, String index_type, String index_id) throwsIOException {
GetRequest getRequest= newGetRequest(index_name, index_type, index_id);
GetResponse getResponse=client.get(getRequest, RequestOptions.DEFAULT);
System.out.println("get: " +JSON.toJSONString(getResponse));
}/*** 批量增加 addTestList方法封装list数据
*
*@throwsIOException*/
private void bulkAdd(String index_name, String index_type, List idList, List>dataList)throwsIOException {
BulkRequest bulkAddRequest= newBulkRequest();for (int i = 0; i < dataList.size(); i++) {
IndexRequest indexRequest= newIndexRequest(index_name, index_type, idList.get(i));
indexRequest.source(JSON.toJSONString(dataList.get(i)), XContentType.JSON);
bulkAddRequest.add(indexRequest);
}
BulkResponse bulkAddResponse=client.bulk(bulkAddRequest, RequestOptions.DEFAULT);
System.out.println("bulkAddResponse: " +JSON.toJSONString(bulkAddResponse));
}/*** 批量更新
*
*@paramindex
*@paramtype
*@paramtests
*@throwsIOException*/
public void bulkUpdate(String index_name, String index_type, ListidList,
List> dataList) throwsIOException {
BulkRequest bulkUpdateRequest= newBulkRequest();for (int i = 0; i < dataList.size(); i++) {
UpdateRequest updateRequest= newUpdateRequest(index_name, index_type, idList.get(i));
updateRequest.doc(JSON.toJSONString(dataList.get(i)), XContentType.JSON);
bulkUpdateRequest.add(updateRequest);
}
BulkResponse bulkUpdateResponse=client.bulk(bulkUpdateRequest, RequestOptions.DEFAULT);
System.out.println("bulkUpdate: " +JSON.toJSONString(bulkUpdateResponse));
}/*** 删除记录
*
*@paramindex
*@paramtype
*@paramid
*@throwsIOException*/
public void bulkDelete(String index_name, String index_type, ListidList,
List> dataList) throwsIOException {
BulkRequest bulkDeleteRequest= newBulkRequest();for (int i = 0; i < idList.size(); i++) {
DeleteRequest deleteRequest= newDeleteRequest(index_name, index_type, idList.get(i));
bulkDeleteRequest.add(deleteRequest);
}
BulkResponse bulkDeleteResponse=client.bulk(bulkDeleteRequest, RequestOptions.DEFAULT);
System.out.println("bulkDelete: " +JSON.toJSONString(bulkDeleteResponse));
}/*** 搜索
*
*@paramindex 要搜索的索引库
*@paramtype 要搜索的索引库类型
*@paramname 要搜索的关键字
*@throwsIOException*/
public void search(String name, String type, String index) throwsIOException {//query查询://match查询:知道分词器存在,会对查询的关键字分词;//team一个关键词/teams多个关键词查询:不知道分词器,不会对查询的关键字分词; 较精确的查询//例子:条件是‘我你’ team查询的是含有‘我你’的,match查询含有‘我你’‘我’‘你’的都能查询出//QueryBuilders.matchQuery("name", name)//filter查询:不计算相关性,且有cache,速度比query查询快//boolBuilder多条件查询:must相当于and, should相当于or,mustnot不符合条件的//聚合查询//sum min max avg cardinality基数(类似去重之后的数量) teams分组//matchQuery(提高召回率,关键字会被分词),//matchPhraseQuery(关键字不会分词), match_phrase提高精准度//matchQuery单一查询QueryBuilders.matchQuery("name", name),//multiMatchQuery匹配多列查询QueryBuilders.multiMatchQuery("music","name","interest"),//wildcardQuery模糊匹配查询QueryBuilders.wildcardQuery("name", "*jack*") *多个 ?一个//QueryBuilders.matchPhraseQuery("字段名字", "前缀");//前缀查询//QueryBuilders.fuzzyQuery("字段名字", "关键字");//模糊查询,跟关键字类似的都可以查询出来 --> 关键字:tet 有可能会搜寻出 test text等//rangeQuery区间查询//geoDistanceQuery经纬度范围商家//排序:ScoreSortBuilder,FieldSortBuilder//关键字查询
BoolQueryBuilder boolBuilder =QueryBuilders.boolQuery();//boolBuilder.must(QueryBuilders.matchQuery("name", name));//
//这里可以根据字段进行搜索,must表示符合条件的,相反的mustnot表示不符合条件的//boolBuilder.must(QueryBuilders.matchQuery("sex", name));//boolBuilder.must(QueryBuilders.matchQuery("id", tests.getId().toString()));//boolQueryBuilder.must(QueryBuilders.termQuery("field","value"));//boolQueryBuilder.must(QueryBuilders.wildcardQuery("field","value"));//boolQueryBuilder.must(QueryBuilders.rangeQuery("field").gt("value"));//boolQueryBuilder.must(QueryBuilders.termsQuery("field","value"));//boolBuilder.should(boolBuilder.filter(QueryBuilders.matchPhraseQuery("name", name)));//boolBuilder.should(boolBuilder.filter(QueryBuilders.matchPhraseQuery("sex", name)));//boolBuilder.should(QueryBuilders.matchPhraseQuery("sex", name));
boolBuilder.should(QueryBuilders.matchPhraseQuery("doc.username", name));//RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("id");// //区间查询,都是闭区间//rangeQueryBuilder.gte(1);//rangeQueryBuilder.lte(1);
SearchSourceBuilder sourceBuilder = newSearchSourceBuilder();
sourceBuilder.query(boolBuilder);//sourceBuilder.query(rangeQueryBuilder);
sourceBuilder.from(0);
sourceBuilder.size(100); //获取记录数,默认10//sourceBuilder.sort("id", SortOrder.ASC);//sourceBuilder.fetchSource(new String[] { "id", "name", "sex", "age" }, new String[] {});//第一个是获取字段,第二个是过滤的字段,默认获取全部
sourceBuilder.fetchSource(new String[] { "doc.username", "doc.password"}, new String[] {}); //第一个是获取字段,第二个是过滤的字段,默认获取全部
SearchRequest searchRequest = newSearchRequest(index);
searchRequest.types(type);
searchRequest.source(sourceBuilder);
SearchResponse response=client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println("search: " +JSON.toJSONString(response));
SearchHits hits=response.getHits();
SearchHit[] searchHits=hits.getHits();for(SearchHit hit : searchHits) {
System.out.println("search -> " +hit.getSourceAsString());
System.out.println("search -> " + hit.getSourceAsMap().get("doc"));
UserEntity parseObject= JSONObject.parseObject(JSONObject.toJSONString(hit.getSourceAsMap().get("doc")), UserEntity.class);
System.out.println("search -> " +parseObject.getUsername());
}
}/*** 范围查询,左右都是闭集
*
*@paramfieldKey
*@paramstart
*@paramend
*@return
*/
publicRangeQueryBuilder rangeMathQuery(String fieldKey, String start, String end) {
RangeQueryBuilder rangeQueryBuilder=QueryBuilders.rangeQuery(fieldKey);
rangeQueryBuilder.gte(start);
rangeQueryBuilder.lte(end);returnrangeQueryBuilder;
}//坐标查询 范围查询
public void searchPoint() throwsIOException {double a = 40.215193;double b = 116.680852;
GeoDistanceQueryBuilder builder= QueryBuilders.geoDistanceQuery("location");
builder.point(a, b);
builder.distance(1000, DistanceUnit.MILES);
SearchSourceBuilder sourceBuilder= newSearchSourceBuilder();
sourceBuilder.query(builder);
GeoDistanceSortBuilder sort= SortBuilders.geoDistanceSort("location", a, b).order(SortOrder.ASC)
.unit(DistanceUnit.KILOMETERS);
sourceBuilder.sort("id", SortOrder.ASC);
SearchRequest searchRequest= new SearchRequest("index1");
searchRequest.types("type1");
searchRequest.source(sourceBuilder);
SearchResponse response=client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits=response.getHits();
SearchHit[] searchHits=hits.getHits();for(SearchHit hit : searchHits) {
System.out.println("search -> " +hit.getSourceAsString());
}
}/*** 创建新增数据
*
*@throwsIOException*/
public void addTestList() throwsIOException {double lat = 38.929986;double lon = 113.395645;for (long i = 201; i < 202; i++) {double max = 0.00001;double min = 0.000001;
Random random= newRandom();double s = random.nextDouble() % (max - min + 1) +max;
DecimalFormat df= new DecimalFormat("######0.000000");//System.out.println(s);
String lons = df.format(s +lon);
String lats= df.format(s +lat);
Double dlon=Double.valueOf(lons);
Double dlat=Double.valueOf(lats);
Tests tests= newTests();
tests.setId(i);
tests.setName("名字啊" +i);
tests.setSex("电话啊" +i);
GeoPoint location= newGeoPoint();
location.setLat(dlat);
location.setLon(dlon);
tests.setLocation(location);
testsList.add(tests);
}
}
}