ElasticSearch 7.8.x技術整理2 - java操作篇 - 更新完畢


3、java操作ES篇

3.1、摸索java鏈接ES的流程

  • 自行創建一個maven項目



3.1.1、依賴管理


    <properties>
        <ES-version>7.8.0</ES-version>
        <log4j-version>1.2.17</log4j-version>
        <junit-version>4.13.2</junit-version>
        <jackson-version>2.13.0</jackson-version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <!-- 注意:這里的版本問題,要和下載的window的ES版本一致,甚至后續用linux搭建也是一樣的
                          到時用linux時,ES、kibana的版本都有這樣的限定
                -->
                <version>${ES-version}</version>
            </dependency>

            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <!-- 注意:這里別搞成了elasticsearch-client
                    這個東西在7.x已經不推薦使用了,而到了8.0之后,這個elasticsearch-client已經完全被廢棄了
                 -->
                <artifactId>elasticsearch-rest-high-level-client</artifactId>
                <!-- 同樣的,注意版本問題 -->
                <version>${ES-version}</version>
            </dependency>

			<!-- 這個我其實沒用,要用的話,可以導入:log4j-api和log4j-core -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j-version}</version>
            </dependency>

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit-version}</version>
            </dependency>

            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>${jackson-version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>




3.1.2、摸索鏈接流程

3.1.2.1、獲取父項目中的依賴

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>




3.1.2.2、摸索流程

	package cn.zixieqing;

	import org.apache.http.HttpHost;
	import org.elasticsearch.client.RestClient;
	import org.elasticsearch.client.RestClientBuilder;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName ConnectionTest
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class ConnectionTest {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 測試java鏈接ES
		 * @Date  2021/12/14
		 * @Param
		 * @return
		 */

		// 下面這個邏輯,對照shiro中的realm、manager、FilterFactoryBean的邏輯來看( 沒用過的就當我沒說^_^ )
		@Test
		public void test() throws IOException {

			// 3、創建HttpHost
			HttpHost host = new HttpHost("127.0.0.1", 9200);// 發現需要:String hostname, int port  這就很簡單了澀
		  // 當然:這個方法重載中有一個參數scheme  這個是:訪問方式 根據需求用http / https都可以  這里想傳的話用:http就可以了

			// 2、創建RestClientBuilder 但是:點擊源碼發現 - 沒有構造方法
			// 既然沒有,那肯定提供得有和xml版的mybatis加載完xml文件之后的builder之類的,找一下
			RestClientBuilder clientBuilder = RestClient.builder(host);
			// 發現1、有重載;2、重載之中有幾個參數,而HttpHost... hosts 這個參數貌似貼近我們想要的東西了,所以建一個HttpHost


			// 1、要鏈接client,那肯定需要一個client咯,正好:導入得有high-level-client
			RestHighLevelClient esClient = new RestHighLevelClient(clientBuilder);   // 發現需要RestClientBuilder,那就建

			// 4、測試:只要 esClient. 就可以看到一些很熟悉的方法,可以在這里測試調一下哪些方法,然后去postman中獲取數據看一下對不對
			// 這里不多做說明:java鏈接ES客戶端的流程就是上面這樣的,不過:這和MySQL數據庫鏈接一樣,記得不用了就關閉
			esClient.close();       // 當然:封裝之后,這個關閉操作應該放出來,然后在封裝的工具中只需要返回這個鏈接對象即可
		}
	}


image

image




3.2、java中操作ES索引

3.2.1、向父項目獲取自己要的依賴


    <dependencies>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>




3.2.2、封裝鏈接對象



	package cn.zixieqing.utile;

	import org.apache.http.HttpHost;
	import org.elasticsearch.client.RestClient;
	import org.elasticsearch.client.RestHighLevelClient;

	/**
	 * @ClassName ESClientUtil
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class ESClientUtil {

		private static final String HOST = "127.0.0.1";     // 用localhost也行,不過后面用linux就要ip,所以:算在這里養成習慣吧
		private static final Integer PORT = 9200;

		public static RestHighLevelClient getESClient() {

			return new RestHighLevelClient( RestClient.builder( new HttpHost( HOST, PORT ) ) );
		}
	}



image




3.2.3、創建索引


	package cn.zixieqing;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.client.indices.CreateIndexRequest;
	import org.elasticsearch.client.indices.CreateIndexResponse;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName CreateIndex
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class CreateIndex {

		@Test
		public void createIndexTest() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			// 創建索引
			// CreateIndexRequest()  第一個參數:要創建的索引名    第二個參數:請求選項  默認即可
			CreateIndexResponse response = esClient.indices().create(
					new CreateIndexRequest("person"), RequestOptions.DEFAULT );


			// 查看是否添加成功  核心方法:isAcknowledged()
			System.out.println( response.isAcknowledged() );


			esClient.close();
		}
	}


image

用postman檢驗一下:
image




3.2.4、查詢索引


	package cn.zixieqing.index;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.client.indices.GetIndexRequest;
	import org.elasticsearch.client.indices.GetIndexResponse;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName SearchIndex
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class SearchIndex {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 查詢索引
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void searchIndexTest() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			// 獲取索引
			GetIndexResponse response = esClient.indices().get(
					new GetIndexRequest("person"), RequestOptions.DEFAULT );


			// 熟悉GetIndexResponse中的幾個api
			System.out.println( "Aliases" + response.getAliases() );
			System.out.println( "Mappings" + response.getMappings() );
			System.out.println( "Settings" + response.getSettings() );      // 這三者在用postman玩的時候,返回結果中都有

			esClient.close();
		}
	}



image

image




3.2.5、刪除索引



	package cn.zixieqing.index;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
	import org.elasticsearch.action.support.master.AcknowledgedResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName DeleteIndex
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class DeleteIndex {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 刪除索引
		 * @Date  2021/12/14
		 * @Param
		 * @return
		 */

		@Test
		public void deleteIndexTest() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			// 刪除索引
			AcknowledgedResponse response = esClient.indices().delete(
					new DeleteIndexRequest("person"), RequestOptions.DEFAULT );

			// 檢驗一下:是否刪除成功
			System.out.println( response.isAcknowledged() );

			esClient.close();
		}
	}




image

用postman再檢測一下:
image




3.3、java操作ES中的_doc - 重點中的重點

3.3.1、創建doc

  • 這里還需要jackson-databind:前面已經導入
  • 同時:為了偷懶,所以把lombok也一起導入了


  • 父項目依賴管理

        <lombok-version>1.18.22</lombok-version>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok-version}</version>
        </dependency>


子項目獲取依賴:


        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>



編寫實體類


	package cn.zixieqing.entity;

	import lombok.AllArgsConstructor;
	import lombok.Data;
	import lombok.NoArgsConstructor;
	import lombok.ToString;
	import lombok.experimental.Accessors;

	import java.io.Serializable;

	/**
	 * @ClassName UserEntity
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/

	@Data
	@AllArgsConstructor
	@NoArgsConstructor
	@ToString
	@Accessors(chain = true)        // lombok的鏈式調用
	public class UserEntity implements Serializable {

		private String id;
		private String name;
		private String sex;
	}



測試:


	package cn.zixieqing.doc;

	import cn.zixieqing.entity.UserEntity;
	import cn.zixieqing.utile.ESClientUtil;
	import com.fasterxml.jackson.databind.ObjectMapper;
	import org.elasticsearch.action.index.IndexRequest;
	import org.elasticsearch.action.index.IndexResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.common.xcontent.XContentType;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName InsertDoc
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class InsertDoc {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 新增文檔_doc,當然下面這個過程利用ESClient封裝的思路也可以抽離
		 * @Date  2021/12/14
		 * @Param
		 * @return
		 */
		@Test
		public void insertDocTest() throws IOException {

			// 1、獲取鏈接
			RestHighLevelClient esClient = ESClientUtil.getESClient();

			IndexRequest request = new IndexRequest();

			// 選擇索引及設置唯一標識
			request.index("user").id("10002");

			// 2、添加數據
			// IndexRequest和IndexResponse這中間就是:做添加doc操作
			UserEntity userEntity = new UserEntity();
			userEntity.setId( "100" ).setName( "紫邪情" ).setSex( "女" );     // lombok鏈式調用

			// 轉json      注:objectMapper是jackson-databind中的,不是ES中的
			String userJson = new ObjectMapper().writeValueAsString( userEntity );

			// 把轉成的json字符串存到ES中去
			request.source( userJson , XContentType.JSON);

			// 3、發起請求 獲取響應對象
			IndexResponse response = esClient.index( request, RequestOptions.DEFAULT );

			// 看看這個IndexResponse有哪些有用的api
			System.out.println( "響應轉態:" + response.getResult() );   // 其他的一點 就可以看到了,都是字面意思

			esClient.close();

		}
	}


image

**postman檢測一下:
image

我的測試結構如下:
image




3.3.2、修改doc

  • 這個修改是指的局部修改,全量修改就不用想了

	package cn.zixieqing.doc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.update.UpdateRequest;
	import org.elasticsearch.action.update.UpdateResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.common.xcontent.XContentType;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName UpdateDoc
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class UpdateDoc {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 修改doc
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void UpdateDoc() throws IOException {

			// 1、獲取鏈接對象
			RestHighLevelClient esClient = ESClientUtil.getESClient();

			UpdateRequest request = new UpdateRequest();

			// 獲取索引
			request.index("user").id("10002");

			// 2、修改doc數據
			request.doc(XContentType.JSON, "name", "邪公子");

			// 3、發起請求、獲得響應對象
			UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT);

			System.out.println( "響應狀態為:" + response.getResult() );

			esClient.close();
		}
	}

image

postman檢驗一下:
image




3.3.3、查詢doc


	package cn.zixieqing.doc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.get.GetRequest;
	import org.elasticsearch.action.get.GetResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName GetDoc
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class GetDoc {

		@Test
		public void getDocTest() throws IOException {

			// 1、獲取鏈接對象
			RestHighLevelClient esClient = ESClientUtil.getESClient();

			GetRequest request = new GetRequest();

			request.index("user").id("10002");

			// 2、發起請求、獲取響應對象
			GetResponse response = esClient.get(request, RequestOptions.DEFAULT);

			// 3、獲取結果  推薦用getSourceAsString()
			String result = response.getSourceAsString();

			System.out.println( "獲得的doc為:" + result );

			esClient.close();
		}
	}

image




3.3.4、刪除doc


	package cn.zixieqing.doc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.delete.DeleteRequest;
	import org.elasticsearch.action.delete.DeleteResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName DeleteDoc
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class DeleteDoc {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 刪除doc
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void deleteDocTest() throws IOException {

			// 1、獲取鏈接對象
			RestHighLevelClient esClient = ESClientUtil.getESClient();

			DeleteRequest request = new DeleteRequest();

			// 獲取索引
			request.index("user").id("10002");

			// 2、做刪除操作
			DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);

			System.out.println( "響應狀態為:" + response.getResult() );

			// 3、關閉鏈接
			esClient.close();
		}
	}

image

再次獲取檢驗一下:
image




3.4.5、批量新增_doc數據

  • 本質:把請求封裝了而已,從而讓這個請求可以傳遞各種類型參數,如:刪除的、修改的、新增的,這樣就可以搭配for循環

	package cn.zixieqing.doc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.bulk.BulkRequest;
	import org.elasticsearch.action.bulk.BulkResponse;
	import org.elasticsearch.action.index.IndexRequest;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.common.xcontent.XContentType;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName BatchDeleteDoc
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class BatchInsertDoc {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 批量添加doc數據
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void batchInsertDocTest() throws IOException {

			// 1、獲取鏈接對象
			RestHighLevelClient esClient = ESClientUtil.getESClient();

			BulkRequest request = new BulkRequest();

			// 當然:source的第二個參數都是傳個對象,這里為了偷懶,嫖了別人的代碼
			request.add( new IndexRequest()
					.index("user")
					.id("520")
					.source( XContentType.JSON, "name", "小紫1") );

			request.add( new IndexRequest()
					.index("user")
					.id("521")
					.source( XContentType.JSON, "name", "小紫2") );

			request.add( new IndexRequest()
					.index("user")
					.id("522")
					.source( XContentType.JSON, "name", "小紫3") );


			// 2、發送請求
			BulkResponse response = esClient.bulk( request, RequestOptions.DEFAULT );

			// 查看執行時間
			System.out.println( response.getTook() );

			esClient.close();

		}
	}

image

postman檢驗一下:


	http://127.0.0.1:9200/user/_search		請求方式 get


	// 返回結果
	{
		"took": 585,
		"timed_out": false,
		"_shards": {
			"total": 1,
			"successful": 1,
			"skipped": 0,
			"failed": 0
		},
		"hits": {
			"total": {
				"value": 3,
				"relation": "eq"
			},
			"max_score": 1.0,
			"hits": [
				{
					"_index": "user",
					"_type": "_doc",
					"_id": "520",
					"_score": 1.0,
					"_source": {
						"name": "小紫1"
					}
				},
				{
					"_index": "user",
					"_type": "_doc",
					"_id": "521",
					"_score": 1.0,
					"_source": {
						"name": "小紫2"
					}
				},
				{
					"_index": "user",
					"_type": "_doc",
					"_id": "522",
					"_score": 1.0,
					"_source": {
						"name": "小紫3"
					}
				}
			]
		}
	}




3.4.6、批量刪除_doc數據

  • 本質:把請求封裝了而已,從而讓這個請求可以傳遞各種類型參數,如:刪除的、修改的、新增的,這樣就可以搭配for循環

	package cn.zixieqing.doc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.bulk.BulkRequest;
	import org.elasticsearch.action.bulk.BulkResponse;
	import org.elasticsearch.action.delete.DeleteRequest;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName BarchDeleteDoc
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class BatchDeleteDoc {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 批量刪除doc數據
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void batchDeleteDoc() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			BulkRequest request = new BulkRequest();
			// 和批量添加相比,變的地方就在這里而已
			request.add(new DeleteRequest().index("user").id("520"));
			request.add(new DeleteRequest().index("user").id("521"));
			request.add(new DeleteRequest().index("user").id("522"));

			BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);

			System.out.println(response.getTook());

			esClient.close();
		}
	}

image

postman檢驗一下:
image




3.4.7、高級查詢 - 重點

3.4.7.1、全量查詢

	package cn.zixieqing.docHighLevel.queryDoc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.search.SearchRequest;
	import org.elasticsearch.action.search.SearchResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.index.query.QueryBuilders;
	import org.elasticsearch.search.SearchHit;
	import org.elasticsearch.search.builder.SearchSourceBuilder;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName MatchAll
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/

	public class MatchAll {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 高級查詢 - 全量查詢  就是基礎語法中在請求體內使用match_all那個知識點
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void matchAllTest() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			// 全量查詢 match_all
			SearchResponse response = esClient.search(  new SearchRequest()
															.indices("user")
															.source(
																new SearchSourceBuilder()
																	.query( QueryBuilders.matchAllQuery() )
															), RequestOptions.DEFAULT );

			// 查看執行了多少時間
			System.out.println( response.getTook() );

			// 把數據遍歷出來看一下
			for ( SearchHit data : response.getHits() ) {
				System.out.println( data.getSourceAsString() );
			}


			esClient.close();


			// 上面的看不懂,那就看下面拆分的過程

	//        // 1、獲取鏈接對象
	//        RestHighLevelClient esClient = ESClientUtil.getESClient();
	//
	//        // 3、創建SearchRequest對象
	//        SearchRequest request = new SearchRequest();
	//        request.indices("user");
	//
	//        // 5、創建SearchSourceBuilder對象
	//        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	//
	//        // 6、進行查詢  發現:需要QueryBuilders對象,看源碼發現:沒有構造,可是:有matchAllQuery()
	//        searchSourceBuilder.query( QueryBuilders.matchAllQuery() );
	//
	//        // 4、調用source()方法獲取數據,但是發現:需要SearchSourceBuilder,繼續創建
	//        request.source( searchSourceBuilder );
	//
	//        // 2、發送請求  發現:需要SearchRequest  那就建一個
	//        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
	//
	//        // 7、獲取數據
	//        for (SearchHit data : response.getHits()) {
	//            System.out.println( data.getSourceAsString() );
	//        }
	//
	//        // 8、關閉鏈接
	//        esClient.close();
		}

	}

image




3.4.7.2、條件查詢

	package cn.zixieqing.docHighLevel.queryDoc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.search.SearchRequest;
	import org.elasticsearch.action.search.SearchResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.index.query.QueryBuilders;
	import org.elasticsearch.search.SearchHit;
	import org.elasticsearch.search.builder.SearchSourceBuilder;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName TermQuery
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class TermQuery {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO term條件查詢  注意:這里不是說的基礎篇中的 filter range 那個條件啊( 這個條件要求的是查詢字段為int類型的 )
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void termQueryTest() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			// 條件查詢
			SearchResponse response = esClient.search( new SearchRequest()
														.indices("user")
														.source( new SearchSourceBuilder()
																 .query( QueryBuilders.termQuery("_id", "520" ) ) ),  // 對照全量查詢:變的就是這里的方法調用
														RequestOptions.DEFAULT );

			for (SearchHit data : response.getHits()) {

				System.out.println( data.getSourceAsString() );
			}

			esClient.close();

		}
	}

image




3.4.7.3、分頁查詢

	package cn.zixieqing.docHighLevel.queryDoc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.search.SearchRequest;
	import org.elasticsearch.action.search.SearchResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.index.query.QueryBuilders;
	import org.elasticsearch.search.SearchHit;
	import org.elasticsearch.search.builder.SearchSourceBuilder;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName LimitQuery
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class LimitQuery {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 分頁查詢    對應基礎篇中的from size
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void limitQueryTest() throws IOException {

			// 1、獲取鏈接對象
			RestHighLevelClient esClient = ESClientUtil.getESClient();

			// 3、創建SearchSourceBuilder
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

			// 4、查詢出所有的數據
			SearchSourceBuilder sourceBuilder = searchSourceBuilder.query( QueryBuilders.matchAllQuery() );

			// 5、對數據進行分頁操作
			sourceBuilder.from(0);
			sourceBuilder.size(2);

			// 2、發送請求
			SearchResponse response = esClient.search( new SearchRequest()
															.indices("user")
															.source( searchSourceBuilder )
														, RequestOptions.DEFAULT );

			// 7、查看數據
			for (SearchHit data : response.getHits()) {

				System.out.println( data.getSourceAsString() );
			}

			// 8、關閉鏈接
			esClient.close();

		}
	}

image




3.4.7.4、排序查詢

	package cn.zixieqing.docHighLevel.queryDoc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.search.SearchRequest;
	import org.elasticsearch.action.search.SearchResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.index.query.QueryBuilders;
	import org.elasticsearch.search.SearchHit;
	import org.elasticsearch.search.builder.SearchSourceBuilder;
	import org.elasticsearch.search.sort.SortOrder;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName SortQuery
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class SortQuery {

		@Test
		public void sortQueryTest() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

			SearchSourceBuilder sourceBuilder = searchSourceBuilder.query( QueryBuilders.matchAllQuery() );

			// 排序  以什么字段排序、排序方式是什么( 注意:別犯低級錯誤啊,用字符串來搞排序 )
			sourceBuilder.sort("_id", SortOrder.DESC);

			SearchResponse response = esClient.search( new SearchRequest()
															.indices("user")
															.source( searchSourceBuilder ),
													   RequestOptions.DEFAULT );

			for (SearchHit data : response.getHits()) {
				System.out.println( data.getSourceAsString() );
			}

			esClient.close();
		}
	}

image




3.4.7.5、條件過濾查詢

	package cn.zixieqing.docHighLevel.queryDoc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.search.SearchRequest;
	import org.elasticsearch.action.search.SearchResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.search.SearchHit;
	import org.elasticsearch.search.builder.SearchSourceBuilder;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName FilterQuery
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class FilterQuery {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 查詢過濾
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void filterQueryTest() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

			// 查詢結果只需要什么?
			String[] includes = { "name" };
			// 查詢結果不需要什么?
			String[] excludes = {};     // 根據需求自行填充

			searchSourceBuilder.fetchSource( includes,excludes );

			SearchResponse response = esClient.search( new SearchRequest()
															.indices("user")
															.source( searchSourceBuilder )
														, RequestOptions.DEFAULT );

			for (SearchHit data : response.getHits()) {

				System.out.println( data.getSourceAsString() );
			}

			esClient.close();
		}
	}

我的數據沒弄好,我建的doc中只有一個name,而老衲又懶得加了,所以:這里別讓結果把自己搞混了
image




3.4.7.6、組合查詢

	package cn.zixieqing.docHighLevel.queryDoc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.search.SearchRequest;
	import org.elasticsearch.action.search.SearchResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.index.query.BoolQueryBuilder;
	import org.elasticsearch.index.query.QueryBuilders;
	import org.elasticsearch.search.SearchHit;
	import org.elasticsearch.search.builder.SearchSourceBuilder;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName UnionQuery
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class UnionQuery {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 組合查詢至must查詢
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void mustQueryTest() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			// 注意:這里產生了改變,是調用的boolQuery()
			BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

			// 必須包含什么?
			boolQuery.must( QueryBuilders.matchQuery("author", "邪") );
			boolQuery.must( QueryBuilders.matchQuery("sex", "girl") );
			// 當然:也就有mustNot()不包含什么了

			SearchResponse response = esClient.search( new SearchRequest()
															.source( new SearchSourceBuilder()
																		.query( boolQuery ) )
														, RequestOptions.DEFAULT );


			for (SearchHit data : response.getHits()) {

				System.out.println( data.getSourceAsString() );
			}
			esClient.close();

		}


		/*
		 * @Author ZiXieQing
		 * @Description // TODO 組合查詢之should查詢
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void shouldQueryTest() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

			// 懶得燒蛇吃  不寫了,知道這個should和must一樣,復制粘貼多個條件即可
			boolQuery.should( QueryBuilders.matchQuery("title", "是") );

			SearchResponse response = esClient.search( new SearchRequest()
															.source( new SearchSourceBuilder()
																		.query(boolQuery) )
														, RequestOptions.DEFAULT );

			for (SearchHit data : response.getHits()) {
				System.out.println( data.getSourceAsString() );
			}

			esClient.close();
		}
	}

must查詢的結果:
image

should查詢的結果
image




3.4.7.7、范圍查詢

	package cn.zixieqing.docHighLevel.queryDoc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.search.SearchRequest;
	import org.elasticsearch.action.search.SearchResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.index.query.QueryBuilders;
	import org.elasticsearch.index.query.RangeQueryBuilder;
	import org.elasticsearch.search.SearchHit;
	import org.elasticsearch.search.builder.SearchSourceBuilder;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName RangeQuery
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class RangeQuery {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 范圍查詢  即:基礎篇中的filter  range
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void rangeQuery() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("id");

			// 對結果進行處理  gt >  lt <   gte >=     lte  <=
			rangeQuery.gt("10000");

			SearchResponse response = esClient.search( new SearchRequest()
															.source( new SearchSourceBuilder()
																		.query( rangeQuery ) )
														, RequestOptions.DEFAULT );

			for (SearchHit data : response.getHits()) {

				System.out.println( data.getSourceAsString() );

			}

			esClient.close();

		}
	}

image




3.4.7.8、模糊查詢

	package cn.zixieqing.docHighLevel.queryDoc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.search.SearchRequest;
	import org.elasticsearch.action.search.SearchResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.common.unit.Fuzziness;
	import org.elasticsearch.index.query.FuzzyQueryBuilder;
	import org.elasticsearch.index.query.QueryBuilders;
	import org.elasticsearch.search.SearchHit;
	import org.elasticsearch.search.builder.SearchSourceBuilder;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName FuzzyQuery
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class FuzzyQuery {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 模糊查詢
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void fuzzyQuery() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			// 模糊查詢
			// fuzziness( Fuzziness.ONE ) 表示的是:字符誤差數  取值有:zero、one、two、auto
			// 誤差數  指的是:fuzzyQuery("author","網二")這里面匹配的字符的誤差嘛
			//                  可以有幾個字符不一樣 / 多 / 少幾個字符?
			FuzzyQueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery("author","網二").fuzziness( Fuzziness.ONE );

			SearchResponse response = esClient.search( new SearchRequest()
															.source( new SearchSourceBuilder()
																			.query(fuzzyQuery) )
														, RequestOptions.DEFAULT );

			for (SearchHit data : response.getHits()) {

				System.out.println( data.getSourceAsString() );
			}

			esClient.close();

		}
	}

image




3.4.7.9、高亮查詢

	package cn.zixieqing.docHighLevel.queryDoc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.search.SearchRequest;
	import org.elasticsearch.action.search.SearchResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.index.query.QueryBuilders;
	import org.elasticsearch.index.query.TermsQueryBuilder;
	import org.elasticsearch.search.SearchHit;
	import org.elasticsearch.search.builder.SearchSourceBuilder;
	import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName HighLightQuery
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/
	public class HighLightQuery {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 高亮查詢 highLight
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void highLightQueryTest() throws IOException {

			// 1、獲取鏈接對象
			RestHighLevelClient esClient = ESClientUtil.getESClient();

			// 3、創建SearchSourceBuilder對象
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

			// 4、查詢什么數據?
			TermsQueryBuilder termsQuery = QueryBuilders.termsQuery("author", "小紫1");

			// 5、構建高亮
			HighlightBuilder highlightBuilder = new HighlightBuilder();

			// 高亮編寫
			highlightBuilder.preTags("<span color='blue'>");    // 構建標簽前綴
			highlightBuilder.postTags("</span>");       // 構建標簽后綴
			highlightBuilder.field("author");     // 構建高亮字段

			// 6、設置高亮
			searchSourceBuilder.highlighter( highlightBuilder );

			// 7、進行查詢
			searchSourceBuilder.query( termsQuery );

			// 2、發送請求、獲取響應對象
			SearchResponse response = esClient.search( new SearchRequest().indices("user").source( searchSourceBuilder ) , RequestOptions.DEFAULT);

			// 驗證
			System.out.println(response);

			for (SearchHit hit : response.getHits()) {
				System.out.println(hit.getSourceAsString());

				System.out.println( hit.getHighlightFields());
			}


			// 9、關閉鏈接
			esClient.close();

		}
	}





3.4.7.10、聚合查詢

	package cn.zixieqing.docHighLevel.queryDoc;

	import cn.zixieqing.utile.ESClientUtil;
	import org.elasticsearch.action.search.SearchRequest;
	import org.elasticsearch.action.search.SearchResponse;
	import org.elasticsearch.client.RequestOptions;
	import org.elasticsearch.client.RestHighLevelClient;
	import org.elasticsearch.search.aggregations.AggregationBuilders;
	import org.elasticsearch.search.builder.SearchSourceBuilder;
	import org.junit.Test;

	import java.io.IOException;

	/**
	 * @ClassName AggQuery
	 * @Author ZiXieQing
	 * @Date 2021/12/14
	 * Version 1.0
	 **/

	// 聚合查詢
	public class AggQuery {

		/*
		 * @Author ZiXieQing
		 * @Description // TODO 最大值查詢
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void maxQueryTest() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

			// max("maxId")  這個名字是隨便取的  不講究,就是取個名字而已        聯想:有max、就有min、avg、count、sum......
			//                                  注:方法變成term()就是分組了
			// field("_id")  對哪個字段求最大值
			searchSourceBuilder.aggregation( AggregationBuilders.max("maxId").field("id") );

			SearchResponse response = esClient.search(new SearchRequest().source(searchSourceBuilder), RequestOptions.DEFAULT);


			// 檢驗
			System.out.println(response);

			esClient.close();
		}


		/*
		 * @Author ZiXieQing
		 * @Description // TODO 分組查詢
		 * @Date  2021/12/14
		 * @Param []
		 * @return void
		 */
		@Test
		public void groupQueryTest() throws IOException {

			RestHighLevelClient esClient = ESClientUtil.getESClient();

			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
			// 分組
			searchSourceBuilder.aggregation( AggregationBuilders.terms("groupQuery").field("author") );

			SearchResponse response = esClient.search( new SearchRequest().source(searchSourceBuilder), RequestOptions.DEFAULT);

			System.out.println(response);

			esClient.close();

		}
	}

image




4、進階篇鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM