ElasticSearch: 使用Java Api 操作 ES
生活随笔
收集整理的這篇文章主要介紹了
ElasticSearch: 使用Java Api 操作 ES
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
對(duì)索引庫(kù)作: 增、刪、改
與之對(duì)應(yīng)的DSL語(yǔ)句
Insert
創(chuàng)建索引庫(kù) (沒(méi)有建立映射)
創(chuàng)建指定名稱(chēng)的索引庫(kù)
@Test public void createIndexTest() throws Exception {// 若是對(duì)索引庫(kù)的增刪改 都需要?jiǎng)?chuàng)建indicesClient對(duì)象, 這個(gè)就是一個(gè)操作數(shù)據(jù)庫(kù)的客戶(hù)端對(duì)象IndicesClient indicesObject = highLevelClient.indices();// 新建索引庫(kù)創(chuàng)建請(qǐng)求: 創(chuàng)建一個(gè)索引庫(kù), 并指定名稱(chēng)CreateIndexRequest createIndexRequest = new CreateIndexRequest("hotel");// 發(fā)出索引庫(kù)創(chuàng)建請(qǐng)求, 并接收索引庫(kù)創(chuàng)建請(qǐng)求的響應(yīng)CreateIndexResponse createIndexResponse = indicesObject.create(createIndexRequest, RequestOptions.DEFAULT);// 是否創(chuàng)建成功log.info("\n索引庫(kù)是否創(chuàng)建成功: {}", createIndexResponse.isAcknowledged());log.info("\n響應(yīng)結(jié)果: {}", createIndexResponse); }創(chuàng)建索引庫(kù), 并創(chuàng)建映射
在索引庫(kù)存在時(shí), 創(chuàng)建映射會(huì)失敗, 原因: 索引庫(kù)已存在
// 給指定索引庫(kù)創(chuàng)建映射樹(shù) @Test public void createMappingTest() throws Exception {// 獲取索引庫(kù)增刪改操作對(duì)象IndicesClient indicesObject = highLevelClient.indices();// 新建索引庫(kù)創(chuàng)建請(qǐng)求: 創(chuàng)建一個(gè)指定名稱(chēng)的索引庫(kù), 并創(chuàng)建映射樹(shù)CreateIndexRequest createIndexRequest = new CreateIndexRequest("hotel");// 新建映射樹(shù)createIndexRequest.mapping("{\n" +" \"properties\": {\n" +" \"id\": {\n" +" \"type\": \"keyword\"\n" +" },\n" +" \"name\": {\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_smart\",\n" +" \"copy_to\": \"all\"\n" +" },\n" +" \"address\": {\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_smart\"\n" +" },\n" +" \"price\": {\n" +" \"type\": \"integer\"\n" +" },\n" +" \"score\": {\n" +" \"type\": \"integer\"\n" +" },\n" +" \"brand\": {\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_smart\",\n" +" \"copy_to\": \"all\"\n" +" },\n" +" \"city\": {\n" +" \"type\": \"keyword\"\n" +" },\n" +" \"starName\": {\n" +" \"type\": \"keyword\"\n" +" },\n" +" \"business\": {\n" +" \"type\": \"keyword\",\n" +" \"copy_to\": \"all\"\n" +" },\n" +" \"location\": {\n" +" \"type\": \"geo_point\"\n" +" },\n" +" \"pic\": {\n" +" \"type\": \"keyword\",\n" +" \"index\": false\n" +" }, \n" +" \"isAD\": {\n" +" \"type\": \"boolean\"\n" +" },\n" +" \"all\": {\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_smart\"\n" +" }\n" +" }\n" +" }", XContentType.JSON);// 發(fā)送創(chuàng)建帶有映射樹(shù)的索引庫(kù)請(qǐng)求, 并接收創(chuàng)建索引庫(kù)請(qǐng)求的響應(yīng)CreateIndexResponse createIndexResponse = indicesObject.create(createIndexRequest, RequestOptions.DEFAULT);// 是否創(chuàng)建成功log.info("\n索引庫(kù)是否創(chuàng)建成功: {}", createIndexResponse.isAcknowledged());log.info("\n響應(yīng)結(jié)果: {}", createIndexResponse); }Delete
刪除指定的索引庫(kù)
刪除指定索引庫(kù)
@Test public void deleteIndexTest() throws Exception {// 獲取刪除索引庫(kù)對(duì)象IndicesClient indicesObject = highLevelClient.indices();// 新建刪除索引庫(kù)請(qǐng)求: 刪除一個(gè)指定名稱(chēng)的索引庫(kù)DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("hotel");// 發(fā)出刪除索引庫(kù)請(qǐng)求, 并接受刪除索引庫(kù)請(qǐng)求的響應(yīng)AcknowledgedResponse deleteIndexResponse = indicesObject.delete(deleteIndexRequest, RequestOptions.DEFAULT);// 判斷是否刪除成功log.info("\n Hotel索引庫(kù)是否刪除成功: {}", deleteIndexResponse.isAcknowledged());log.info("\n響應(yīng)結(jié)果: {}", deleteIndexResponse); }對(duì)文檔作: 增、刪、改、查
Insert / Update (ES處理修改時(shí), 是作覆蓋式修改)
批量添加 (方案一)
導(dǎo)入數(shù)據(jù)庫(kù)中的數(shù)據(jù)到ES中 (批量導(dǎo)入)
public void createIndexWithMappingWithImportData() throws Exception {// 獲取索引庫(kù)操作對(duì)象IndicesClient indicesObject = highLevelClient.indices();// 創(chuàng)建索引庫(kù)CreateIndexRequest createIndexRequest = new CreateIndexRequest("hotel");// 創(chuàng)建映射createIndexRequest.mapping("{\n" +" \"properties\": {\n" +" \"id\": {\n" +" \"type\": \"keyword\"\n" +" },\n" +" \"name\": {\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_max_word\",\n" +" \"copy_to\": \"all\"\n" +" },\n" +" \"address\": {\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_max_word\"\n" +" },\n" +" \"price\": {\n" +" \"type\": \"integer\"\n" +" },\n" +" \"score\": {\n" +" \"type\": \"integer\"\n" +" },\n" +" \"brand\": {\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_max_word\",\n" +" \"copy_to\": \"all\"\n" +" },\n" +" \"city\": {\n" +" \"type\": \"keyword\"\n" +" },\n" +" \"starName\": {\n" +" \"type\": \"keyword\"\n" +" },\n" +" \"business\": {\n" +" \"type\": \"keyword\",\n" +" \"copy_to\": \"all\"\n" +" },\n" +" \"location\": {\n" +" \"type\": \"geo_point\"\n" +" },\n" +" \"pic\": {\n" +" \"type\": \"keyword\",\n" +" \"index\": false\n" +" }, \n" +" \"isAD\": {\n" +" \"type\": \"boolean\"\n" +" },\n" +" \"all\": {\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_max_word\"\n" +" }\n" +" }\n" +" }",XContentType.JSON);// 發(fā)送索引庫(kù)創(chuàng)建請(qǐng)求CreateIndexResponse createIndexResponse = indicesObject.create(createIndexRequest, RequestOptions.DEFAULT);log.info("\n索引庫(kù)創(chuàng)建結(jié)果: {}", createIndexResponse.isAcknowledged());log.info("\n響應(yīng)結(jié)果: {}", createIndexResponse);// 查詢(xún)數(shù)據(jù)庫(kù)List<Hotel> hotels = hotelMapper.selectList(null);// Copy 到 HotelDochotels.forEach(hotel -> {try {// 將Hotel Copy To HotelDoc 中HotelDoc hotelDoc = new HotelDoc(hotel);// 創(chuàng)建文檔IndexRequest hotelIndex = new IndexRequest("hotel").id(hotel.getId().toString());// 將HotelDoc轉(zhuǎn)換為JsonString hotelDocToJson = objectMapper.writeValueAsString(hotelDoc);// 填充內(nèi)容hotelIndex.source(hotelDocToJson, XContentType.JSON);// 發(fā)送文檔創(chuàng)建請(qǐng)求IndexResponse indexResponse = highLevelClient.index(hotelIndex, RequestOptions.DEFAULT);// 獲取創(chuàng)建后的文檔idlog.info("ES文檔, id: {}",indexResponse.getId());} catch (Exception e) {throw new RuntimeException(e);}});}批量添加 (方案二)
批量添加 (方案二)
@Test public void BulkSearchDocument() throws Exception {// 查詢(xún)數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)List<Hotel> hotels = hotelMapper.selectList(null);// 獲取批量添加對(duì)象BulkRequest bulkRequest = new BulkRequest();// 遍歷所有數(shù)據(jù)hotels.forEach(hotel -> {try {// 查詢(xún)所有數(shù)據(jù)HotelDoc hotelDoc = new HotelDoc(hotel);// 將查詢(xún)的結(jié)果轉(zhuǎn)換為JsonString hotelDocToJson = objectMapper.writeValueAsString(hotelDoc);// 設(shè)定指定索引庫(kù) 及 文檔idIndexRequest indexRequest = new IndexRequest("hotel").id(hotel.getId().toString());// 將Json添加到IndexRequest請(qǐng)求中indexRequest.source(hotelDocToJson, XContentType.JSON);// 添加請(qǐng)求bulkRequest.add(indexRequest);}catch (Exception e) {throw new RuntimeException(e.getMessage());}});// 發(fā)送批量添加請(qǐng)求BulkResponse bulkResponse = highLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);log.info("批量添加結(jié)果: {}", bulkResponse.status()); }Query
查詢(xún)指定文檔id
指定文檔id, 查詢(xún)文檔
public void queryDocument() throws Exception {// 指定索引庫(kù)民初, 獲取查詢(xún)文檔的請(qǐng)求對(duì)象GetRequest hotel = new GetRequest("hotel").id("36934");// 發(fā)送查詢(xún)請(qǐng)求GetResponse getResponse = highLevelClient.get(hotel, RequestOptions.DEFAULT);// 獲取查詢(xún)結(jié)果String sourceAsString = getResponse.getSourceAsString();// 將Json轉(zhuǎn)換為HotelDoc實(shí)體類(lèi)HotelDoc hotelDoc = objectMapper.readValue(sourceAsString, HotelDoc.class);log.info("hotelDoc: {}", hotelDoc); }Delete
刪除指定文檔id
刪除指定文檔id
public void deleteDocument() throws Exception {// 獲取指定索引庫(kù), 且指定文檔id的刪除文檔對(duì)象var deleteRequest = new DeleteRequest("hotel").id("36934");// 發(fā)送刪除文檔請(qǐng)求DeleteResponse deleteResponse = highLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);log.info("deleteResponse: {}", deleteResponse.getId()); }條件查詢(xún)
查詢(xún)所有 (沒(méi)有特定條件)
public void queryAllDocument() throws Exception {// 獲取查詢(xún)對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");// 構(gòu)建查詢(xún)條件: 查詢(xún)所有SearchSourceBuilder matchAllQuery = searchRequest.source().query(QueryBuilders.matchAllQuery());// 設(shè)置展示的條目searchRequest.source().size(1000);// 發(fā)送查詢(xún)請(qǐng)求SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 處理查詢(xún)結(jié)果ArrayList<HotelDoc> hotelDocs = new ArrayList<>();// 獲取查詢(xún)結(jié)果集SearchHits hits = searchResponse.getHits();// 遍歷結(jié)果集for (SearchHit hit : hits) {// 獲取文檔內(nèi)容JsonString searchResult = hit.getSourceAsString();// 將Json轉(zhuǎn)換為JavaBeanHotelDoc hotelDoc = objectMapper.readValue(searchResult, HotelDoc.class);// 添加到集合中hotelDocs.add(hotelDoc);}// 全文查詢(xún)狀態(tài)log.info("\n查詢(xún)?nèi)繝顟B(tài): {}", searchResponse.status());// 輸出所有查詢(xún)結(jié)果hotelDocs.forEach(hotelDoc -> log.info("\n查詢(xún)?nèi)拷Y(jié)果: {}", hotelDoc)); }單字段查詢(xún)
public void queryOneDocument() throws Exception {// 獲取查詢(xún)對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");// 構(gòu)建查詢(xún)條件: 單字段查詢(xún)searchRequest.source().query(QueryBuilders.matchQuery("all", "如家"));// 設(shè)置展示條目searchRequest.source().size(1000);// 發(fā)送查詢(xún)請(qǐng)求SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 收集結(jié)果ArrayList<HotelDoc> hotelDocs = new ArrayList<>();// 處理查詢(xún)結(jié)果SearchHits hits = searchResponse.getHits();// 遍歷結(jié)果集for (SearchHit hit : hits) {// 獲取查詢(xún)的結(jié)果String searchResult = hit.getSourceAsString();// 將結(jié)果(Json串) 轉(zhuǎn)換為 JavaBeanHotelDoc hotelDoc = objectMapper.readValue(searchResult, HotelDoc.class);hotelDocs.add(hotelDoc);}// 單字段查詢(xún)狀態(tài)log.info("\n單字段查詢(xún)狀態(tài): {}", searchResponse.status());// 輸出所有查詢(xún)結(jié)果hotelDocs.forEach(hotelDoc -> log.info("\n單字段查詢(xún)結(jié)果: {}", hotelDoc)); }多字段查詢(xún)
public void queryManyDocuments() throws Exception {// 獲取查詢(xún)請(qǐng)求對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");// 構(gòu)建查詢(xún)條件: 多字段查詢(xún)searchRequest.source().query(QueryBuilders.multiMatchQuery("如家", "name", "brand"));// 設(shè)置展示條目searchRequest.source().size(1000);// 發(fā)送查詢(xún)請(qǐng)求SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 收集結(jié)果ArrayList<HotelDoc> hotelDocs = new ArrayList<>();// 處理查詢(xún)結(jié)果SearchHits hits = searchResponse.getHits();// 遍歷結(jié)果集for (SearchHit hit : hits) {// 獲取結(jié)果String searchResult = hit.getSourceAsString();// 將查詢(xún)結(jié)果轉(zhuǎn)換為JavaBeanHotelDoc hotelDoc = objectMapper.readValue(searchResult, HotelDoc.class);hotelDocs.add(hotelDoc);}// 多字段查詢(xún)狀態(tài)log.info("\n多字段查詢(xún)狀態(tài): {}", searchResponse.status());// 輸出所有查詢(xún)結(jié)果hotelDocs.forEach(hotelDoc -> log.info("\n多字段查詢(xún)結(jié)果: {}", hotelDoc)); }精準(zhǔn)查詢(xún) (不會(huì)對(duì)查詢(xún)條件分詞)
Term (精準(zhǔn)值查詢(xún))
@Test public void termSearch() throws Exception {// 獲取查詢(xún)對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");// 構(gòu)建查詢(xún)條件TermQueryBuilder queryBuilder = QueryBuilders.termQuery("name", "如家");searchRequest.source().query(queryBuilder);// 設(shè)置頁(yè)面大小searchRequest.source().size(1000);// 發(fā)送查詢(xún)請(qǐng)求SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 收集查詢(xún)結(jié)果ArrayList<HotelDoc> hotelDocs = new ArrayList<>();// 處理查詢(xún)結(jié)果SearchHits hits = searchResponse.getHits();// 遍歷結(jié)果集for (SearchHit hit : hits) {// 獲取查詢(xún)結(jié)果String searchResult = hit.getSourceAsString();// Json轉(zhuǎn)換為JavaBeanHotelDoc hotelDoc = objectMapper.readValue(searchResult, HotelDoc.class);hotelDocs.add(hotelDoc);}// 精確查詢(xún)狀態(tài)log.info("\n精確查詢(xún)狀態(tài): {}", searchResponse.status());// 輸出所有查詢(xún)結(jié)果hotelDocs.forEach(hotelDoc -> log.info("\n精確查詢(xún)結(jié)果: {}", hotelDoc)); }Range (范圍查詢(xún))
@Test public void rangeSearch() throws Exception {// 獲取查詢(xún)對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");// 構(gòu)建查詢(xún)條件: gte: 大于等于, lte: 小于等于searchRequest.source().query(QueryBuilders.rangeQuery("price").gte(99).lte(199));searchRequest.source().size(1000);// 發(fā)送查詢(xún)請(qǐng)求SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 收集查詢(xún)結(jié)果ArrayList<HotelDoc> hotelDocs = new ArrayList<>();// 處理查詢(xún)結(jié)果SearchHits hits = searchResponse.getHits();// 遍歷結(jié)果集for (SearchHit hit : hits) {// 獲取查詢(xún)結(jié)果String searchResult = hit.getSourceAsString();// Json轉(zhuǎn)換為JavaBeanHotelDoc hotelDoc = objectMapper.readValue(searchResult, HotelDoc.class);hotelDocs.add(hotelDoc);}// 范圍查詢(xún)狀態(tài)log.info("\n范圍查詢(xún)狀態(tài): {}", searchResponse.status());// 輸出所有查詢(xún)結(jié)果hotelDocs.forEach(hotelDoc -> log.info("\n范圍查詢(xún)結(jié)果: {}", hotelDoc)); }地理位置查詢(xún)
圓形
public void geoDistanceSearch() throws Exception {// 獲取查詢(xún)對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");// 構(gòu)建查詢(xún)條件searchRequest.source().query(QueryBuilders.geoDistanceQuery("location").point(new GeoPoint(31.21, 121.5)).distance("15km")).size(1000);// 發(fā)送查詢(xún)條件SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 收集查詢(xún)結(jié)果ArrayList<HotelDoc> hotelDocs = new ArrayList<>();// 處理查詢(xún)結(jié)果SearchHits hits = searchResponse.getHits();// 遍歷結(jié)果集for (SearchHit hit : hits) {// 獲取查詢(xún)結(jié)果String searchResult = hit.getSourceAsString();// Json轉(zhuǎn)換JavaBeanHotelDoc hotelDoc = objectMapper.readValue(searchResult, HotelDoc.class);// 添加到集合hotelDocs.add(hotelDoc);}// 地理坐標(biāo)查詢(xún)狀態(tài)log.info("\n地理坐標(biāo)查詢(xún)狀態(tài): {}", searchResponse.status());// 輸出所有查詢(xún)結(jié)果hotelDocs.forEach(hotelDoc -> log.info("\n地理坐標(biāo)查詢(xún)結(jié)果: {}", hotelDoc)); }矩形
public void geoBoundingBoxSearch() throws Exception {// 獲取查詢(xún)對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");// 構(gòu)建查詢(xún)條件searchRequest.source().query(QueryBuilders.geoBoundingBoxQuery("location").setCorners(new GeoPoint(31.1, 121.5),new GeoPoint(30.9, 121.7))).size(1000);// 發(fā)送查詢(xún)請(qǐng)求SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 接收結(jié)果ArrayList<HotelDoc> hotelDocs = new ArrayList<>();// 處理查詢(xún)結(jié)果SearchHits hits = searchResponse.getHits();// 遍歷結(jié)果集for (SearchHit hit : hits) {// 獲取查詢(xún)結(jié)果String searchResult = hit.getSourceAsString();// Json轉(zhuǎn)換為JavaBeanHotelDoc hotelDoc = objectMapper.readValue(searchResult, HotelDoc.class);// 添加到集合hotelDocs.add(hotelDoc);}// 地理坐標(biāo)查詢(xún)狀態(tài)log.info("\n地理坐標(biāo)查詢(xún)狀態(tài): {}", searchResponse.status());// 輸出所有查詢(xún)結(jié)果hotelDocs.forEach(hotelDoc -> log.info("\n地理坐標(biāo)查詢(xún)結(jié)果: {}", hotelDoc)); }組合條件查詢(xún)
查詢(xún)?nèi)珖?guó)的酒店名稱(chēng)不為七天的上海的所有酒店, 價(jià)格范圍大于等于99, 小于等于199, 而且查詢(xún)的地址位置是31,21, 121.5, 范圍半徑20km
@Test public void boolSearch() throws Exception {// 獲取查詢(xún)對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");// 構(gòu)建查詢(xún)條件searchRequest.source().query(QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("price").gte(99).lte(199)).mustNot(QueryBuilders.termQuery("name", "七天")).filter(QueryBuilders.geoDistanceQuery("location").point(31.21, 121.5).distance("20km")).should(QueryBuilders.termQuery("city", "上海"))).size(1000);// 發(fā)送查詢(xún)請(qǐng)求SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 接收查詢(xún)結(jié)果ArrayList<HotelDoc> hotelDocs = new ArrayList<>();// 處理查詢(xún)結(jié)果for (SearchHit hit : searchResponse.getHits()) {// 獲取查詢(xún)結(jié)果String searchResult = hit.getSourceAsString();// Json 轉(zhuǎn)換為 JavaBeanHotelDoc hotelDoc = objectMapper.readValue(searchResult, HotelDoc.class);// 添加查詢(xún)結(jié)果hotelDocs.add(hotelDoc);}// 組合條件查詢(xún)狀態(tài)log.info("\n組合條件查詢(xún)狀態(tài): {}", searchResponse.status());// 輸出所有查詢(xún)結(jié)果hotelDocs.forEach(hotelDoc -> log.info("\n組合條件查詢(xún)結(jié)果: {}", hotelDoc)); }算分查詢(xún)
查詢(xún)?nèi)缂揖频?#xff0c; 對(duì)于深圳的如家進(jìn)行+10分
public void addScoreSearch() throws Exception {// 獲取查詢(xún)對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");// 構(gòu)建查詢(xún)條件searchRequest.source().query(QueryBuilders.functionScoreQuery(QueryBuilders.matchQuery("all", "如家"),new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("city", "深圳"),ScoreFunctionBuilders.weightFactorFunction(10f))}).boostMode(CombineFunction.SUM)).size(1000);// 發(fā)送查詢(xún)請(qǐng)求SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 接收查詢(xún)結(jié)果ArrayList<HotelDoc> hotelDocs = new ArrayList<>();// 處理查詢(xún)結(jié)果for (SearchHit hit : searchResponse.getHits()) {// 獲取查詢(xún)結(jié)果String searchResult = hit.getSourceAsString();// Json 轉(zhuǎn)換為 JavaBeanHotelDoc hotelDoc = objectMapper.readValue(searchResult, HotelDoc.class);// 添加查詢(xún)結(jié)果hotelDocs.add(hotelDoc);}// 算分查詢(xún)狀態(tài)log.info("\n算分查詢(xún)狀態(tài): {}", searchResponse.status());// 輸出所有查詢(xún)結(jié)果hotelDocs.forEach(hotelDoc -> log.info("\n算分查詢(xún)結(jié)果: {}", hotelDoc)); }排序查詢(xún)
地理位置排序查詢(xún)
查找離設(shè)定經(jīng)緯度坐標(biāo)最近的如家酒店
@Test public void orderSearch() throws Exception {// 獲取查詢(xún)對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");// 構(gòu)建查詢(xún)條件searchRequest.source().query(QueryBuilders.matchQuery("all", "如家")).sort(SortBuilders.geoDistanceSort("location", new GeoPoint(39.76, 116.33)) // SortBuilders.geoDistanceSort("location", 39.76, 116.33) 兩者結(jié)果一致.order(SortOrder.ASC).unit(DistanceUnit.KILOMETERS)).size(1000).from(0) // 從第一頁(yè)開(kāi)始查詢(xún).size(7) // 每次查詢(xún)7條, 類(lèi)似于mysql中的limit, 使用了這個(gè), 就會(huì)覆蓋query下的size, DSL語(yǔ)句會(huì)報(bào)錯(cuò), 但JavaCode不會(huì);// 發(fā)送查詢(xún)請(qǐng)求SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 處理查詢(xún)結(jié)果SearchHits hits = searchResponse.getHits();// 地理位置排序查詢(xún)狀態(tài)log.info("\n地理位置排序查詢(xún)狀態(tài): {}", searchResponse.status());// 地理位置排序查詢(xún)總條目log.error("\n地址位置排序查詢(xún)總條目: {}", hits.getTotalHits().value);// 遍歷結(jié)果集for (SearchHit hit : hits) {// 獲取查詢(xún)結(jié)果String searchResult = hit.getSourceAsString();// 獲取查詢(xún)出的酒店位置距離設(shè)定的位置有多遠(yuǎn)Object[] sortValues = hit.getSortValues();// 若不是經(jīng)緯度查詢(xún), 則距離值則為空, 直接Json轉(zhuǎn)換為JavaBeanHotelDoc hotelDoc = objectMapper.readValue(searchResult, HotelDoc.class);// 輸出查詢(xún)結(jié)果log.info("\n查詢(xún)結(jié)果: {}", hotelDoc);log.info("距離設(shè)定的位置有: {}km", sortValues[0]);} }指定字段排序查詢(xún)
倒序查詢(xún)?nèi)珖?guó)所有如家品牌酒店的價(jià)格
@Test public void sortSearchAll() throws Exception {// 獲取查詢(xún)對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");// 構(gòu)建查詢(xún)條件searchRequest.source().query(QueryBuilders.matchQuery("all", "如家")).sort(SortBuilders.fieldSort("price").order(SortOrder.DESC)).size(1000);// 發(fā)送查詢(xún)請(qǐng)求SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 收集查詢(xún)結(jié)果ArrayList<HotelDoc> hotelDocs = new ArrayList<>();// 處理查詢(xún)結(jié)果SearchHits hits = searchResponse.getHits();// 遍歷結(jié)果集for (SearchHit hit : hits) {// 獲取查詢(xún)結(jié)果String searchResult = hit.getSourceAsString();// Json轉(zhuǎn)換為JavaBeanHotelDoc hotelDoc = objectMapper.readValue(searchResult, HotelDoc.class);// 添加到集合hotelDocs.add(hotelDoc);}// 指定字段排序查詢(xún)狀態(tài)log.info("\n地理位置排序查詢(xún)狀態(tài): {}", searchResponse.status());// 指定字段排序查詢(xún)總條目log.error("\n指定字段排序查詢(xún)總條目: {}", hits.getTotalHits().value);// 輸出所有查詢(xún)結(jié)果hotelDocs.forEach(hotelDoc -> log.info("\n指定字段排序查詢(xún)結(jié)果: {}", hotelDoc)); }高亮顯示
查詢(xún)?nèi)缂揖频? 并高亮顯示為粉色
@Test public void highlightSearch() throws Exception {// 獲取查詢(xún)對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");// 構(gòu)建查詢(xún)條件searchRequest.source().query(QueryBuilders.matchQuery("all", "如家")).from(6) // 顯示第2頁(yè)數(shù)據(jù).size(7) // 只顯示7條.highlighter(SearchSourceBuilder.highlight().field("name").requireFieldMatch(false).preTags("<font color = 'pink'>").postTags("</font>"));// 發(fā)送查詢(xún)請(qǐng)求SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 收集查詢(xún)結(jié)果ArrayList<HotelDoc> hotelDocs = new ArrayList<>();// 處理查詢(xún)結(jié)果SearchHits hits = searchResponse.getHits();// 遍歷結(jié)果集for (SearchHit hit : hits) {// 獲取查詢(xún)結(jié)果String searchResult = hit.getSourceAsString();// Json轉(zhuǎn)換為JavaBeanHotelDoc hotelDoc = objectMapper.readValue(searchResult, HotelDoc.class);// 處理高亮結(jié)果: 獲取需要高亮的字段HighlightField nameHighlightField = hit.getHighlightFields().get("name");// 判斷HighlightField對(duì)象不為空, ObjectUtil是MyBatisPlus的工具類(lèi)if (ObjectUtils.isEmpty(nameHighlightField)) {// 獲取第一個(gè)元素內(nèi)容Text newValue = nameHighlightField.getFragments()[0];// 將Json轉(zhuǎn)換后的JavaBean中指定的屬性替換為新的值hotelDoc.setName(newValue.toString());}// 添加到集合hotelDocs.add(hotelDoc);}// 指定字段高亮顯示查詢(xún)狀態(tài)log.info("\n指定字段高亮顯示查詢(xún)狀態(tài): {}", searchResponse.status());// 指定字段高亮顯示查詢(xún)總條目log.error("\n指定字段高亮顯示查詢(xún)總條目: {}", hits.getTotalHits().value);// 輸出所有查詢(xún)結(jié)果hotelDocs.forEach(hotelDoc -> log.info("\n指定字段高亮顯示查詢(xún)結(jié)果: {}", hotelDoc)); }聚合查詢(xún)
Bucket (桶查詢(xún))
聚合查詢(xún): 桶聚合, 查詢(xún)?nèi)珖?guó)每個(gè)城市的酒店數(shù)量
@Test public void bucketSearch() throws Exception {// 獲取查詢(xún)對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");// 構(gòu)建查詢(xún)條件searchRequest.source().size(0).aggregation(AggregationBuilders.terms("cityCountAgg") // 桶名稱(chēng).field("city") // 統(tǒng)計(jì)字段.order(BucketOrder.count(true) // true = asc, false = desc).size(7) // 只展示7條數(shù)據(jù));// 發(fā)送查詢(xún)請(qǐng)求SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 處理查詢(xún)結(jié)果: 接收結(jié)果必須使用Terms, 并且是ElasticSearch包中的Terms cityCountAgg = searchResponse.getAggregations().get("cityCountAgg");// 獲取桶List<? extends Terms.Bucket> cityBuckets = cityCountAgg.getBuckets();// 遍歷結(jié)果集for (Terms.Bucket cityBucket : cityBuckets) {// 獲取統(tǒng)計(jì)到的城市名稱(chēng)String cityName = cityBucket.getKeyAsString();// 獲取統(tǒng)計(jì)到的城市的所有酒店數(shù)量long cityCount = cityBucket.getDocCount();log.info("統(tǒng)計(jì)到的城市名稱(chēng): {}", cityName);log.info("獲取統(tǒng)計(jì)到的城市的所有酒店數(shù)量: {}", cityCount);} }自動(dòng)補(bǔ)全
@Test public void autoCompletionSearch() throws Exception {// 獲取查詢(xún)對(duì)象SearchRequest searchRequest = new SearchRequest("hotel");//添加自動(dòng)補(bǔ)全的查詢(xún)條件searchRequest.source().suggest(new SuggestBuilder().addSuggestion("searchSuggetion",SuggestBuilders.completionSuggestion("suggestion").prefix("如").skipDuplicates(true).size(33)));//發(fā)出請(qǐng)求SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 處理結(jié)果集CompletionSuggestion searchSuggetion = searchResponse.getSuggest().getSuggestion("searchSuggetion");List<CompletionSuggestion.Entry.Option> options = searchSuggetion.getOptions();List<String> result = new ArrayList<>();//遍歷options取出所有的提示內(nèi)容存儲(chǔ)到集合中,返回for (CompletionSuggestion.Entry.Option option : options) {result.add(option.getText().toString());}log.info("\n自動(dòng)補(bǔ)全查詢(xún)結(jié)果: {}", result); }總結(jié)
以上是生活随笔為你收集整理的ElasticSearch: 使用Java Api 操作 ES的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 迅雷7 down.php,迅雷协议分析
- 下一篇: 基于PCA算法生成平均脸