Третья боевая серия ElasticSearch: руководство ElasticSearch по JAVA API

Elasticsearch

предисловие

Представлено в предыдущем постеБоевая серия ElasticSearch 2: Учебное пособие по использованию оператора DSL ElasticSearch --- подробная графика и текст, в этой статье объясняется использование официального Java API ElasticSearch 6.x.

ElasticSearch JAVA API

В настоящее время на рынке существует несколько распространенных пакетов Java API ElasticSearch, таких как JestClient, SpringData, интегрированный SpringBoot, ElasticsearchTemplate, интегрированный Spring, Elasticsearch Bboss и другие пакеты фреймворков с открытым исходным кодом. use. , за исключением того, что поддерживаемая версия ES будет ниже.

В этой статье представлен официальный ElasticSearchJava High Level REST Clientиспользование,Java High Level REST ClientВ настоящее время рекомендуется ElasticSearch, подходит для версий выше 6.x, требует JDK выше 1.8, что может быть хорошо совместимо в больших версиях, а сам пакет полки также содержитJava Low Level REST ClientМетод в , может иметь дело с некоторыми особыми потребностями, он инкапсулирует стиль Restful для некоторых часто используемых методов и может вызываться непосредственно в соответствии с именем операции, а также поддерживает синхронные и асинхронные (асинхронные) вызовы.

Наше использование здесь также может напрямую соответствовать оператору DSL в предыдущей статье, так что его можно легко сравнить и использовать для обучения.

В следующих операциях давайте сначала посмотрим на ElasticsearchJava High Level REST ClientНачальное подключение написано.


	RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost(elasticIp, elasticPort)));

Не правда ли, очень просто, и закрыть его тоже очень просто, клиент можно закрыть напрямую, если он не пустой!

1. Новые данные

ElasticSearch может напрямую добавлять данные, если вы укажете индекс (имя библиотеки индексов) и тип (тип). При добавлении можно указать ID первичного ключа самостоятельно, а можно не указывать, он генерируется самим ElasticSearch. Эластичный поискJava High Level REST ClientЕсть три способа добавления новых данных. Здесь мы рассмотрим эти три способа записи.

Новый пример кода данных 1, созданный jsonString:

    String index = "test1";
	String type = "_doc";
	// 唯一编号
	String id = "1";
	IndexRequest request = new IndexRequest(index, type, id);

	String jsonString = "{" + "\"uid\":\"1234\","+ "\"phone\":\"12345678909\","+ "\"msgcode\":\"1\"," + "\"sendtime\":\"2019-03-14 01:57:04\","
			+ "\"message\":\"xuwujing study Elasticsearch\"" + "}";
	request.source(jsonString, XContentType.JSON);
	IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

Новый пример кода данных 2, созданный картой, будет автоматически преобразован в данные json:

    String index = "test1";
	String type = "_doc";
	// 唯一编号
	String id = "1";
	IndexRequest request = new IndexRequest(index, type, id);
	Map<String, Object> jsonMap = new HashMap<>();
	jsonMap.put("uid", 1234);
	jsonMap.put("phone", 12345678909L);
	jsonMap.put("msgcode", 1);
	jsonMap.put("sendtime", "2019-03-14 01:57:04");
	jsonMap.put("message", "xuwujing study Elasticsearch");
	request.source(jsonMap);
	IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

Добавьте пример кода данных 3, создайте его через объект XContentBuilder:

   String index = "test1";
	String type = "_doc";
	// 唯一编号
	String id = "1";
	IndexRequest request = new IndexRequest(index, type, id);
	XContentBuilder builder = XContentFactory.jsonBuilder();
	builder.startObject();
	{
		builder.field("uid", 1234);
		builder.field("phone", 12345678909L);
		builder.field("msgcode", 1);
		builder.timeField("sendtime", "2019-03-14 01:57:04");
		builder.field("message", "xuwujing study Elasticsearch");
	}
	builder.endObject();
	request.source(builder);
	IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

Из трех вышеперечисленных методов я лично рекомендую второй, который легче понять и использовать.

2. Создайте библиотеку индексов

В приведенном выше примере мы создали библиотеку индексов путем непосредственного создания данных, но та, которая сгенерирована самой ES без создания библиотеки индексов, не является удобной, поскольку она будет использовать конфигурацию по умолчанию, а структура поля — текст (текст) Данные будет сегментирован, и при хранении он будет занимать дополнительное место.) Значения по умолчанию для шардов и копий индекса — 5 и 1. Количество шардов ES нельзя изменить после создания, если только не переиндексировать, поэтому здесь мы по-прежнему Указываем шаблон данных для создания. Существует три способа создания библиотеки индексов с использованием JAVA API, как описано выше для добавления данных, но здесь представлен только один.

Пример кода для добавления библиотеки индексов:

private static void createIndex() throws IOException {
	String type = "_doc";
	String index = "test1";
	// setting 的值
	Map<String, Object> setmapping = new HashMap<>();
	// 分区数、副本数、缓存刷新时间
	setmapping.put("number_of_shards", 10);
	setmapping.put("number_of_replicas", 1);
	setmapping.put("refresh_interval", "5s");
	Map<String, Object> keyword = new HashMap<>();
	//设置类型
	keyword.put("type", "keyword");
	Map<String, Object> lon = new HashMap<>();
	//设置类型
	lon.put("type", "long");
	Map<String, Object> date = new HashMap<>();
	//设置类型
	date.put("type", "date");
	date.put("format", "yyyy-MM-dd HH:mm:ss");

	Map<String, Object> jsonMap2 = new HashMap<>();
	Map<String, Object> properties = new HashMap<>();
	//设置字段message信息
	properties.put("uid", lon);
	properties.put("phone", lon);
	properties.put("msgcode", lon);
	properties.put("message", keyword);
	properties.put("sendtime", date);
	Map<String, Object> mapping = new HashMap<>();
	mapping.put("properties", properties);
	jsonMap2.put(type, mapping);

	GetIndexRequest getRequest = new GetIndexRequest();
	getRequest.indices(index);
	getRequest.local(false);
	getRequest.humanReadable(true);
	boolean exists2 = client.indices().exists(getRequest, RequestOptions.DEFAULT);
	//如果存在就不创建了
	if(exists2) {
		System.out.println(index+"索引库已经存在!");
		return;
	}
	// 开始创建库
	CreateIndexRequest request = new CreateIndexRequest(index);
	try {
		// 加载数据类型
		request.settings(setmapping);
		//设置mapping参数
		request.mapping(type, jsonMap2);
		//设置别名
		request.alias(new Alias("pancm_alias"));
		CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
		boolean falg = createIndexResponse.isAcknowledged();
		if(falg){
			System.out.println("创建索引库:"+index+"成功!" );
		}
	} catch (IOException e) {
		e.printStackTrace();
	}

}

Примечание. При создании библиотеки индексов необходимо сначала определить, существует ли она! ! !Псевдоним также указывается при создании здесь библиотеки индексов. Этот псевдоним полезен. Правильное использование может повысить производительность запросов. Мы сохраним его для следующего раза.

3. Измените данные

Когда ES предоставляет API-интерфейс модификации, есть два способа: один — изменить напрямую, но если данные не существуют, будет выдано исключение, а другой — обновить, если они не существуют, и вставить их, если они есть. не существует. По сравнению с первым второй будет проще в использовании, но он уступает первому по скорости записи.

Пример модифицированного кода ES:

private static void update() throws IOException {
	String type = "_doc";
	String index = "test1";
	// 唯一编号
	String id = "1";
	UpdateRequest upateRequest = new UpdateRequest();
	upateRequest.id(id);
	upateRequest.index(index);
	upateRequest.type(type);

	// 依旧可以使用Map这种集合作为更新条件
	Map<String, Object> jsonMap = new HashMap<>();
	jsonMap.put("uid", 12345);
	jsonMap.put("phone", 123456789019L);
	jsonMap.put("msgcode", 2);
	jsonMap.put("sendtime", "2019-03-14 01:57:04");
	jsonMap.put("message", "xuwujing study Elasticsearch");
	upateRequest.doc(jsonMap);
	// upsert 方法表示如果数据不存在,那么就新增一条
	upateRequest.docAsUpsert(true);
	client.update(upateRequest, RequestOptions.DEFAULT);
	System.out.println("更新成功!");

}

Примечание: Метод upsert означает, что если данные не существуют, то будут добавлены новые, по умолчанию false.

4. Удалить данные

По вышеупомянутым операциям само собой разумеется, что мы уже знаем, что это метод DELETE, поэтому начнем непосредственно.

Пример кода удаления ES на основе идентификатора:

private static void delete() throws IOException {

	String type = "_doc";
	String index = "test1";
	// 唯一编号
	String id = "1";
	DeleteRequest deleteRequest = new DeleteRequest();
	deleteRequest.id(id);
	deleteRequest.index(index);
	deleteRequest.type(type);
	// 设置超时时间
	deleteRequest.timeout(TimeValue.timeValueMinutes(2));
	// 设置刷新策略"wait_for"
	// 保持此请求打开,直到刷新使此请求的内容可以搜索为止。此刷新策略与高索引和搜索吞吐量兼容,但它会导致请求等待响应,直到发生刷新
	deleteRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);
	// 同步删除
	DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
}		

ES удаляет по условиям:

   private static void deleteByQuery() throws IOException {
	String type = "_doc";
	String index = "test1";
	DeleteByQueryRequest request = new DeleteByQueryRequest(index,type);
	// 设置查询条件
	request.setQuery(QueryBuilders.termsQuery("uid",1234));
	// 同步执行
	BulkByScrollResponse bulkResponse = client.deleteByQuery(request, RequestOptions.DEFAULT);
}

Результаты теста

пример графика:

проверить предложение

Здесь кратко представлены несколько часто используемых API-интерфейсов запросов, а затем непосредственно приведены все коды операторов запросов.

API запросов

  • Эквивалент (термин запроса: QueryBuilders.termQuery(имя, значение);
  • Запрос с несколькими значениями (терминами): QueryBuilders.termsQuery(имя,значение,значение2,значение3...);
  • Запрос диапазона: QueryBuilders.rangeQuery(имя).gte(значение).lte(значение);
  • Существует запрос: QueryBuilders.existsQuery(имя);
  • Нечеткий (шаблонный) запрос: QueryBuilders.wildcardQuery(name,+value+);
  • Комбинированный (логический) запрос: BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

Запросить все образцы кода

 private static void allSearch() throws IOException {
    SearchRequest searchRequestAll = new SearchRequest();
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(QueryBuilders.matchAllQuery());
    searchRequestAll.source(searchSourceBuilder);
    // 同步查询
    SearchResponse searchResponseAll = client.search(searchRequestAll, RequestOptions.DEFAULT);
    System.out.println("所有查询总数:" + searchResponseAll.getHits().getTotalHits());
}

Общий пример кода запроса

По сути, это эквивалентный запрос, но он добавляет такие настройки, как пейджинг, сортировка, время ожидания, маршрутизация и т. д., а также добавляет некоторую обработку результатов запроса.

   private static void genSearch() throws IOException {
    String type = "_doc";
    String index = "test1";
    // 查询指定的索引库
    SearchRequest searchRequest = new SearchRequest(index);
    searchRequest.types(type);
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    // 设置查询条件
    sourceBuilder.query(QueryBuilders.termQuery("uid", "1234"));
    // 设置起止和结束
    sourceBuilder.from(0);
    sourceBuilder.size(5);
    sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    // 设置路由
//		searchRequest.routing("routing");
    // 设置索引库表达式
    searchRequest.indicesOptions(IndicesOptions.lenientExpandOpen());
    // 查询选择本地分片,默认是集群分片
    searchRequest.preference("_local");

    // 排序
    // 根据默认值进行降序排序
//	sourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));
    // 根据字段进行升序排序
//	sourceBuilder.sort(new FieldSortBuilder("id").order(SortOrder.ASC));

    // 关闭suorce查询
//	sourceBuilder.fetchSource(false);

    String[] includeFields = new String[]{"title", "user", "innerObject.*"};
    String[] excludeFields = new String[]{"_type"};
    // 包含或排除字段
//	sourceBuilder.fetchSource(includeFields, excludeFields);

    searchRequest.source(sourceBuilder);
	System.out.println("普通查询的DSL语句:"+sourceBuilder.toString());
    // 同步查询
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

    // HTTP状态代码、执行时间或请求是否提前终止或超时
    RestStatus status = searchResponse.status();
    TimeValue took = searchResponse.getTook();
    Boolean terminatedEarly = searchResponse.isTerminatedEarly();
    boolean timedOut = searchResponse.isTimedOut();

    // 供关于受搜索影响的切分总数的统计信息,以及成功和失败的切分
    int totalShards = searchResponse.getTotalShards();
    int successfulShards = searchResponse.getSuccessfulShards();
    int failedShards = searchResponse.getFailedShards();
    // 失败的原因
    for (ShardSearchFailure failure : searchResponse.getShardFailures()) {
        // failures should be handled here
    }
    // 结果
    searchResponse.getHits().forEach(hit -> {
        Map<String, Object> map = hit.getSourceAsMap();
        System.out.println("普通查询的结果:" + map);
    });
    System.out.println("\n=================\n");
}

или запрос

На самом деле это или запрос также является разновидностью логического запроса Оператор запроса здесь эквивалентен оператору SQL.

SELECT * FROM test1 where (uid = 1 or uid =2) and phone = 12345678919

Пример кода:

private static void orSearch() throws IOException {
    SearchRequest searchRequest = new SearchRequest();
    searchRequest.indices("test1");
    searchRequest.types("_doc");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    BoolQueryBuilder boolQueryBuilder2 = new BoolQueryBuilder();
 
      /**
     *  SELECT * FROM test1 where (uid = 1234 or uid =12345)  and phone = 12345678909
     * */
    boolQueryBuilder2.should(QueryBuilders.termQuery("uid", 1234));
    boolQueryBuilder2.should(QueryBuilders.termQuery("uid", 12345));
    boolQueryBuilder.must(boolQueryBuilder2);
    boolQueryBuilder.must(QueryBuilders.termQuery("phone", "12345678909"));
    searchSourceBuilder.query(boolQueryBuilder);
    System.out.println("或查询语句:" + searchSourceBuilder.toString());
    searchRequest.source(searchSourceBuilder);
    // 同步查询
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

    searchResponse.getHits().forEach(documentFields -> {

        System.out.println("查询结果:" + documentFields.getSourceAsMap());
    });

}

нечеткий запрос

Эквивалент аналогичного запроса в операторе SQL.

private static void likeSearch() throws IOException {
    String type = "_doc";
    String index = "test1";
    SearchRequest searchRequest = new SearchRequest();
    searchRequest.indices(index);
    searchRequest.types(type);
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

   /**
     *  SELECT * FROM p_test where  message like '%xu%';
     * */
    boolQueryBuilder.must(QueryBuilders.wildcardQuery("message", "*xu*"));
    searchSourceBuilder.query(boolQueryBuilder);
    System.out.println("模糊查询语句:" + searchSourceBuilder.toString());
    searchRequest.source(searchSourceBuilder);
    // 同步查询
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    searchResponse.getHits().forEach(documentFields -> {
        System.out.println("模糊查询结果:" + documentFields.getSourceAsMap());
    });
    System.out.println("\n=================\n");
}

Многозначный запрос

То есть он эквивалентен in query в операторе SQL.

 	 private static void inSearch() throws IOException {
        String type = "_doc";
        String index = "test1";
        // 查询指定的索引库
        SearchRequest searchRequest = new SearchRequest(index,type);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        /**
         *  SELECT * FROM p_test where uid in (1,2)
         * */
        // 设置查询条件
        sourceBuilder.query(QueryBuilders.termsQuery("uid", 1, 2));
        searchRequest.source(sourceBuilder);
  		System.out.println("in查询的DSL语句:"+sourceBuilder.toString());
        // 同步查询
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        // 结果
        searchResponse.getHits().forEach(hit -> {
            Map<String, Object> map = hit.getSourceAsMap();
            String string = hit.getSourceAsString();
            System.out.println("in查询的Map结果:" + map);
            System.out.println("in查询的String结果:" + string);
        });

        System.out.println("\n=================\n");
    }

Запрос существования

Чтобы определить, существует ли поле, его использование аналогично существующему в операторе SQL.

  private static void existSearch() throws IOException {
    String type = "_doc";
    String index = "test1";
    // 查询指定的索引库
    SearchRequest searchRequest = new SearchRequest(index);
    searchRequest.types(type);
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    // 设置查询条件
     sourceBuilder.query(QueryBuilders.existsQuery("msgcode"));
    searchRequest.source(sourceBuilder);
    System.out.println("存在查询的DSL语句:"+sourceBuilder.toString());
    // 同步查询
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    // 结果
    searchResponse.getHits().forEach(hit -> {
        Map<String, Object> map = hit.getSourceAsMap();
        String string = hit.getSourceAsString();
        System.out.println("存在查询的Map结果:" + map);
        System.out.println("存在查询的String结果:" + string);
    });
    System.out.println("\n=================\n");
}

запрос диапазона

Это то же самое, что использовать в операторе SQL, где gt больше, lt меньше, gte больше или равно, а lte меньше или равно.

private static void rangeSearch() throws IOException{
    String type = "_doc";
    String index = "test1";
    SearchRequest searchRequest = new SearchRequest(index);
    searchRequest.types(type);
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    // 设置查询条件
    sourceBuilder.query(QueryBuilders.rangeQuery("sendtime").gte("2019-01-01 00:00:00").lte("2019-12-31 23:59:59"));
    searchRequest.source(sourceBuilder);
     System.out.println("范围查询的DSL语句:"+sourceBuilder.toString());
    // 同步查询
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    // 结果
    searchResponse.getHits().forEach(hit -> {
        String string = hit.getSourceAsString();
        System.out.println("范围查询的String结果:" + string);
    });
    System.out.println("\n=================\n");
}

Обычный запрос

ES может использовать регулярность для запроса, и метод запроса также очень прост.Пример кода выглядит следующим образом:

 private static void regexpSearch() throws IOException{
    String type = "_doc";
    String index = "test1";
    // 查询指定的索引库
    SearchRequest searchRequest = new SearchRequest(index);
    searchRequest.types(type);
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    // 设置查询条件
    sourceBuilder.query(QueryBuilders.regexpQuery("message","xu[0-9]"));
    searchRequest.source(sourceBuilder);
	 System.out.println("正则查询的DSL语句:"+sourceBuilder.toString());
    // 同步查询
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    // 结果
    searchResponse.getHits().forEach(hit -> {
        Map<String, Object> map = hit.getSourceAsMap();
        String string = hit.getSourceAsString();
        System.out.println("正则查询的Map结果:" + map);
        System.out.println("正则查询的String结果:" + string);
    });

    System.out.println("\n=================\n");
}

Результаты теста запроса

Всего запросов: 6 Оператор DSL для общего запроса: {"from":0,"size":5,"timeout":"60s","query":{"term":{"uid":{"value":"1234", "повышение": 1.0}}}}

=================

Или оператор запроса: {"query":{"bool":{"must":[{"bool":{"should":[{"term":{"uid":{"value":1234,"boost ":1.0}}},{"term":{"uid":{"value":12345,"boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}},{" термин":{"телефон":{"значение":"12345678909","повышение":1.0}}}],"adjust_pure_negative":true,"увеличение":1.0}}} Или результат запроса: {msgcode=1, uid=12345, phone=12345678909, message=qq, sendtime=2019-03-14 01:57:04}

=================

Оператор нечеткого запроса: {"запрос":{"bool":{"должен":[{"подстановочный знак":{"сообщение":{"подстановочный знак":"xu","boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}}} Нечеткий результат запроса: {msgcode=2, uid=12345, phone=123456789019, sendtime=2019-03-14 01:57:04, message=xuwujing study Elasticsearch} Нечеткий результат запроса: {uid=123456, phone=12345678909, message=xu1, sendtime=2019-03-14 01:57:04}

=================

Оператор DSL для существующего запроса: {"query":{"exists":{"field":"msgcode","boost":1.0}}} Результат запроса: {msgcode=2, uid=12345, phone=123456789019, sendtime=2019-03-14 01:57:04, message=xuwujing study Elasticsearch} Строковый результат существующего запроса: {"uid":12345,"phone":123456789019,"msgcode":2,"sendtime":"2019-03-14 01:57:04","message":"xuwujing study Elasticsearch "} Результат запроса карты: {msgcode=1, uid=12345, phone=12345678909, message=qq, sendtime=2019-03-14 01:57:04} Строковый результат существующего запроса: {"uid":"12345","phone":"12345678909","message":"qq","msgcode":"1","sendtime":"2019-03-14 01 :57:04"}

=================

Оператор DSL для запроса диапазона: {"query":{"range":{"sendtime":{"from":"2019-01-01 00:00:00","to":"2019-12-31 23 :59:59","include_lower":true,"include_upper":true,"boost":1.0}}}} Строковый результат запроса диапазона: {"uid":12345,"phone":123456789019,"msgcode":2,"sendtime":"2019-03-14 01:57:04","message":"xuwujing study Elasticsearch "} Строковый результат запроса диапазона: {"uid":"123456","phone":"12345678909","message":"xu1","sendtime":"2019-03-14 01:57:04"} Строковый результат запроса диапазона: {"uid":"12345","phone":"12345678909","message":"qq","msgcode":"1","sendtime":"2019-03-14 01 :57:04"}

=================

Оператор регулярного запроса DSL: {"query":{"regexp":{"message":{"value":"xu[0-9]","flags_value":65535,"max_determinized_states":10000,"boost": 1.0}}}} Сопоставьте результат обычного запроса: {uid=123456, phone=12345678909, message=xu1, sendtime=2019-03-14 01:57:04} Строковый результат обычного запроса: {"uid":"123456","phone":"12345678909","message":"xu1","sendtime":"2019-03-14 01:57:04"}

=================

Оператор DSL для комбинированного запроса: {"query":{"bool":{"must":[{"term":{"uid":{"value":12345,"boost":1.0}}},{" term":{"msgcode":{"value":1,"boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}}} Строковый результат комбинированного запроса: {"uid":"12345","phone":"12345678909","message":"qq","msgcode":"1","sendtime":"2019-03-14 01 :57:04"}

=================

разное

Обратитесь к официальной документации ES:woohoo.elastic.co/expensive/en/bad…

Чтобы узнать, как использовать интегрированные в SpringBoot ElasticSearch и JestClient, вы можете прочитать эту статью:SpringBoot интегрирует ElasticSearch для достижения совместимости с несколькими версиями.

Что касается выбора ElasticSearch Java API, если версия ElasticSearch ниже 6.x, рекомендуется использовать JestClient. Если это после 6.x и вы хотите обновить до 7.x, то напрямую используйте официальный ESJava High Level REST Client, потому что он будет отброшен сразу после 7.xTransport clientМетод подключения текущей интеграции Spring и SpringBoot использует этот метод (не знаю, будет ли он корректироваться в будущем).

Код для этой статьи был включен в мой собственныйjava-studyВ проекте, если вам интересно, добро пожаловать в звездочки, форки и выпуски. адрес проекта:GitHub.com/Netherworld/Срочно…

Боевая серия ElasticSearch: Боевая серия ElasticSearch, первая серия: кластер ElasticSearch + руководство по установке Kinaba Боевая серия ElasticSearch 2: Учебное пособие по использованию оператора DSL ElasticSearch --- подробная графика и текст

музыкальная рекомендация

Оригинал не просто, если вы чувствуете себя хорошо, я надеюсь дать рекомендацию! Ваша поддержка - самая большая мотивация для моего письма! Уведомление об авторских правах: Автор: ничтожество Источник блога сада:www.cnblogs.com/xuwujingИсточник CSDN:blog.csdn.net/qazwsxpcm     Источник личного блога:www.panchengming.com