elasticsearch7.6.2和logstash安装和初步

news2024/12/26 23:53:03

一、linux安装

参考以下链接:
Linux(centos7)如何部署ElasticSearch7.6.2单节点跟集群(es部署指南)

二、window安装

参考下文更加详细:windows ElasticSearch 7.6.0集群搭建

2.1 下载elasticsearch7.6.2window版

可去官网:
也可去社区:elastic中文社区下载地址

2.2 解压

解压后图片

2.3 节点配置

改elasticsearch7.6.2的配置文件elasticsearch.yml,该文件路径为es1/conf/elasticsearch.yml

2.3.1 节点一

#集群名称,保证唯一
cluster.name: my-elasticsearch
#节点名称,必须不一样
node.name: node-1
#必须为本机的IP地址
network.host: 127.0.0.1
#服务端口号,在同一机器下必须不一样
http.port: 9201
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9301
#设置集群自动发现机器IP集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]
#是否支持跨域,默认为false
http.cors.enabled: true
#当设置允许跨域,默认为*,表示支持所有域名
http.cors.allow-origin: "*"
#指定master
cluster.initial_master_nodes: node-1

2.3.2 节点二

#集群名称,保证唯一
cluster.name: my-elasticsearch
#节点名称,必须不一样
node.name: node-2
#必须为本机的IP地址
network.host: 127.0.0.1
#服务端口号,在同一机器下必须不一样
http.port: 9202
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9302
#设置集群自动发现机器IP集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]
#是否支持跨域,默认为false
http.cors.enabled: true
#当设置允许跨域,默认为*,表示支持所有域名
http.cors.allow-origin: "*"
#指定master
cluster.initial_master_nodes: node-1

2.3.2 节点三

#集群名称,保证唯一
cluster.name: my-elasticsearch
#节点名称,必须不一样
node.name: node-3
#必须为本机的IP地址
network.host: 127.0.0.1
#服务端口号,在同一机器下必须不一样
http.port: 9203
#集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9303
#设置集群自动发现机器IP集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]
#是否支持跨域,默认为false
http.cors.enabled: true
#当设置允许跨域,默认为*,表示支持所有域名
http.cors.allow-origin: "*"
#指定master
cluster.initial_master_nodes: node-1

2.4 分别启动三台机器

进入各自bin目录,执行:

./eslasticsearch

如上方法依次启动三个节点的,启动完成之后可以看到三个节点成功。
成功后使用浏览器进入:127.0.0.1:9200,查看是否成功。

2.5 使用对应的ik分词器

analyzer [ik_smart] not found for field [name]

三、Cerebro的使用(未设置账号密码)

本人在window测试环境搭建,es访问和cerebro访问都未设置密码,如果要设置账号密码,可参考此文:Elastic监控工具 - cerebro

3.1 下载window版本cerebro

下载地址:cerebro下载地址
因为我是window版本,下载.zip文件,linux可选择.tgz。

3.2 解压 cerebro-0.8.5.zip

略。

3.3 启动

打开命令行窗口,在cerebro/bin目录,执行

./cerebro

3.4 进入cerebro主页

启动完成之后在浏览器输入: http://localhost:9000/

3.5 在Node Address中输入节点地址

在上图Node Address中输入节点地址,任一节点地址都行:
在这里插入图片描述
点击Connect,即可看到当前集群中三个节点状态:
在这里插入图片描述
关于cerebro的一些基本功能,后续再详述。

四、logstash安装

4.1 安装及使用

参考文章:
logstash同步数据到es

4.2 我的安装及使用

4.2.1 增加xx.conf

增加logstash-test-log-sync.conf配置:

input {
        stdin {}
        jdbc {
                type => "jdbc"
                jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/test_db?useUnicode=true&allowMultiQuerie=true&characterEncoding=utf-8&serverTimezone=UTC"
                # 数据库连接账号密码;
                jdbc_user => "root"
                jdbc_password => "root"
                # MySQL依赖包路径;
                jdbc_driver_library => "E:\Java\Document\m2\repository\mysql\mysql-connector-java\5.1.21\mysql-connector-java-5.1.21.jar"
                # the name of the driver class for mysql
                jdbc_driver_class => "com.mysql.jdbc.Driver"
                #是否开启分页
                jdbc_paging_enabled => "true"
                #分页条数
                jdbc_page_size => "50000"
                # 执行的sql 文件路径+名称
                #statement_filepath => "/data/my_sql2.sql"
                #SQL语句,也可以使用statement_filepath来指定想要执行的SQL
                #statement => "SELECT * FROM `user` where id > :sql_last_value"
				statement => "SELECT * FROM `user`"
                #每一分钟做一次同步
                schedule => "* * * * *"
                #是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false)
                lowercase_column_names => false
                # 是否记录上次执行结果,true表示会将上次执行结果的tracking_column字段的值保存到last_run_metadata_path指定的文件中;
                record_last_run => true
                # 需要记录查询结果某字段的值时,此字段为true,否则默认tracking_column为timestamp的值;
                use_column_value => true
                # 需要记录的字段,用于增量同步,需是数据库字段
                tracking_column => "id"
                # record_last_run上次数据存放位置;
                last_run_metadata_path => "E:\\JavaSoftWare\\ES\\logstash-7.6.2\\sql_last_value"
                #是否将字段名转换为小写,默认true(如果有数据序列化、反序列化需求,建议改为false)
                clean_run => false
        }
}
 
filter {
    json {
        source => "message"
        remove_field => ["message"]
    }
	mutate  {
        remove_field => ["@timestamp","@version"]
    }
}
 
output {
        elasticsearch {
                 # 配置ES集群地址
                hosts => ["127.0.0.1:9201","127.0.0.1:9202","127.0.0.1:9203"]
                 # 索引名字,必须小写
				index => "logstash-test"
				#数据唯一索引(建议使用数据库KeyID)
				document_id => "%{id}"
        }
        stdout {
        }
}

4.2.2 执行命令

执行命令:

 ./logstash -f ../conf/logstash-test-log-sync.conf

下面是我执行过程中遇到的报错日志,以及解决方法,逐一列出,希望对诸君有用。

4.2.2.1 报错一:

![在这里插入图片描述](https://img-blog.csdnimg.cn/9f6d0a1db7e64bb38c2c4ad1014100be.png在这里插入图片描述
解决方法:把logstash-test-log-sync.conf配置字符集需要UTF-无BOM 保存。
参考文章:Elasticsearch解决分页慢以及日志整合监控的方案

4.2.2.2 报错二:

继续执行:

./logstash -f ../conf/logstash-test-log-sync.conf

报错如下:
在这里插入图片描述
原因:es集群地址填写不对。
解决方法:如下地址填写正确:
在这里插入图片描述

4.2.2.3 报错三

不是报错,是卡在这里一致不执行,我设置的是默认,一分钟执行一次:
在这里插入图片描述

4.2.2.4 报错四

在这里插入图片描述
原来是mysql链接错误,改为:
在这里插入图片描述

4.3 结果

最终logstash执行成功。
查看执行结果:
在这里插入图片描述

五、es的demo

5.1 spring-boot-starter-data-elasticsearch(基于es 5.1)

优点:

  • 封装了很多通用方法以及注解式操作简化了开发流程。
  • 与springBoot 集成更快速。

缺点:

  • elasticsearch官方更新的版本速度太快,而springboot速度明显略慢。
  • elasticsearch随着版本升级API略有变化,spring-data-elasticsearch容易遇到版本不兼容问题。

5.1.1 引入依赖

	<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
			<version>2.1.0.RELEASE</version>
		</dependency>

5.1.2 配置

spring:
    data:
        elasticsearch:
            cluster-name: my-elasticsearch
            cluster-nodes: 127.0.0.1:9301,127.0.0.1:9302,127.0.0.1:9303

5.1.3 创建实体类

@Data
@ToString
@Document(indexName = "global_search_index",type = "global_search")
public class ESGlobalSearch implements Serializable {
	/**
	 * ID,唯一字段
	 */
	@Id
	@Field(type= FieldType.Keyword,store = true)
	private String id;

	/**
	 * 主题(搜索关键字)
	 */
	@Field(type = FieldType.Text,store = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
	private String title;

	/**
	 * 主题副本(提高搜索精度)
	 */
	@Field(type = FieldType.Text,store = true,analyzer = "standard")
	private String roughTitle;

	/**
	 * 标签(预留字段,搜索扩展)
	 */
	@Field(type = FieldType.Text,store = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
	private String label;

	/**
	 * 内容(预留字段)
	 */
	@Field(type = FieldType.Text,store = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
	private String content;

	/**
	 * 应用类型(1.医生;2.医院;3.应用)
	 */
	@Field(type = FieldType.Integer,store = true)
	private Integer applicationType;

	/**
	 * 应用类型信息
	 */
	@Field(type = FieldType.Text,store = true)
	private String applicationInfo;
}

5.1.4 创建xxRepository

public interface ESGlobalSearchMapper  extends ElasticsearchRepository<ESGlobalSearch,String> {
	/**
	 * 根据标题检索
	 * @param title
	 * @param roughTitle
	 * @return
	 */
	List<ESGlobalSearch> findByTitleOrRoughTitle(String title, String roughTitle);
}

5.1.5 测试

@SpringBootTest(classes = EsApplication.class)
@RunWith(SpringRunner.class)
public class EsGlobalSearchTest {
	@Autowired
	ESGlobalSearchMapper esGlobalSearchMapper;
	@Test
	public void saveTest(){
		ESGlobalSearch esGlobalSearch = new ESGlobalSearch();
		esGlobalSearch.setApplicationInfo("1");
		esGlobalSearch.setApplicationType(1);
		esGlobalSearch.setContent("测试Content");
		esGlobalSearch.setId("1");
		esGlobalSearch.setLabel("测试Label");
		esGlobalSearch.setRoughTitle("测试");
		esGlobalSearch.setTitle("测试title");
		ESGlobalSearch save = esGlobalSearchMapper.save(new ESGlobalSearch());
	}

	@Test
	public void findAllTest(){
		Iterable<ESGlobalSearch> iter = esGlobalSearchMapper.findAll();
		for (ESGlobalSearch esGlobalSearch : iter) {
			System.out.println(esGlobalSearch);
		}
	}

	/**
	 * 它可以根据名称,自动实现功能
	 */
	@Test
	public void findByTitleOrRoughTitle(){
		List<ESGlobalSearch> list = esGlobalSearchMapper.findByTitleOrRoughTitle("张", "张");
		for (ESGlobalSearch esGlobalSearch : list) {
			System.out.println(esGlobalSearch);
		}
	}

	/**
	 * 基本查询
	 */
	@Test
	public void testQuery(){
		// 词条查询
		MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "周国岭");
		//执行查询
		Iterable<ESGlobalSearch> items = this.esGlobalSearchMapper.search(queryBuilder);
		items.forEach(item -> System.out.println(item));
	}

	@Test
	public void testFuzzyQuery(){
		NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
		queryBuilder.withQuery(QueryBuilders.fuzzyQuery("title","杭州"));

		Page<ESGlobalSearch> page = this.esGlobalSearchMapper.search(queryBuilder.build());
		List<ESGlobalSearch> list = page.getContent();
		list.forEach(esGlobalSearch -> System.out.println(esGlobalSearch));
	}
	/**
	 * es分页处理
	 */
	@Test
	public void testNativeQuery2(){
		// 构建查询条件
		NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
		// 添加基本的分词查询
		queryBuilder.withQuery(QueryBuilders.termQuery("title", "杭州"));
		queryBuilder.withQuery(QueryBuilders.matchAllQuery());
		// 初始化分页参数
		int page = 0;
		int size = 3;
		// 设置分页参数
		queryBuilder.withPageable(PageRequest.of(page, size));
		// 执行搜索,获取结果
		Page<ESGlobalSearch> pages = this.esGlobalSearchMapper.search(queryBuilder.build());
		// 打印总条数
		System.out.println(pages.getTotalElements());
		// 打印总页数
		System.out.println(pages.getTotalPages());
		// 每页大小
		System.out.println(pages.getSize());
		// 当前页
		System.out.println(pages.getNumber());

		List<ESGlobalSearch> list = pages.getContent();
		list.forEach( esGlobalSearch -> System.out.println(esGlobalSearch));
	}

	/**
	 * 排序
	 */
	@Test
	public void testSort(){
		NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
		//查询全部
		queryBuilder.withQuery(QueryBuilders.matchAllQuery());
		// 初始化分页参数
		int page = 0;
		int size = 3;
		// 设置分页参数
		queryBuilder.withPageable(PageRequest.of(page, size));
		queryBuilder.withSort(SortBuilders.fieldSort("id").order(SortOrder.DESC));
		// 执行搜索,获取结果
		Page<ESGlobalSearch> pages = this.esGlobalSearchMapper.search(queryBuilder.build());
		List<ESGlobalSearch> list = pages.getContent();
		list.forEach( esGlobalSearch -> System.out.println(esGlobalSearch));

	}

	@Test
	public void testBooleanQuery() {
		NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
		builder.withQuery(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("title", "周国岭"))
				.must(QueryBuilders.termQuery("roughTitle", "周国岭"))
		);

		Page<ESGlobalSearch> list = this.esGlobalSearchMapper.search(builder.build());
		for (ESGlobalSearch item : list) {
			System.out.println(item);
		}
	}
}

5.1.6 更多查询

简介
spring data elsaticsearch提供了三种构建查询模块的方式:

基本的增删改查:继承spring data提供的接口就默认提供
接口中声明方法:**无需实现类。**spring data根据方法名,自动生成实现类,方法名必须符合一定的规则
接口只要继承 ElasticsearchRepository 类即可。默认会提供很多实现,比如 CRUD 和搜索相关的实现。类似于 JPA 读取数据。
支持的默认方法有:
count(), findAll(), findOne(ID), delete(ID), deleteAll(), exists(ID), save(DomainObject), save(Iterable)。

接口的命名是遵循规范的。常用命名规则如下:

表格内容摘自官网(官方文档:传送门)

关键字方法命名Elasticsearch查询DSL语法示例
AndfindByNameAndPrice{ “query” : { “bool” : { “must” : [ { “query_string” : { “query” : “?”, “fields” : [ “name” ] } }, { “query_string” : { “query” : “?”, “fields” : [ “price” ] } } ] } }}
OrfindByNameOrPrice{ “query” : { “bool” : { “should” : [ { “query_string” : { “query” : “?”, “fields” : [ “name” ] } }, { “query_string” : { “query” : “?”, “fields” : [ “price” ] } } ] } }}
IsfindByName{ “query” : { “bool” : { “must” : [ { “query_string” : { “query” : “?”, “fields” : [ “name” ] } } ] } }}
NotfindByNameNot{ “query” : { “bool” : { “must_not” : [ { “query_string” : { “query” : “?”, “fields” : [ “name” ] } } ] } }}
BetweenfindByPriceBetween{ “query” : { “bool” : { “must” : [ {“range” : {“price” : {“from” : ?, “to” : ?, “include_lower” : true, “include_upper” : true } } } ] } }}
LessThanfindByPriceLessThan{ “query” : { “bool” : { “must” : [ {“range” : {“price” : {“from” : null, “to” : ?, “include_lower” : true, “include_upper” : false } } } ] } }}
LessThanEqualfindByPriceLessThanEqual{ “query” : { “bool” : { “must” : [ {“range” : {“price” : {“from” : null, “to” : ?, “include_lower” : true, “include_upper” : true } } } ] } }}
GreaterThanfindByPriceGreaterThan{ “query” : { “bool” : { “must” : [ {“range” : {“price” : {“from” : ?, “to” : null, “include_lower” : false, “include_upper” : true } } } ] } }}
GreaterThanEqualfindByPriceGreaterThan{ “query” : { “bool” : { “must” : [ {“range” : {“price” : {“from” : ?, “to” : null, “include_lower” : true, “include_upper” : true } } } ] } }}
BeforefindByPriceBefore{ “query” : { “bool” : { “must” : [ {“range” : {“price” : {“from” : null, “to” : ?, “include_lower” : true, “include_upper” : true } } } ] } }}
AfterfindByPriceAfter{ “query” : { “bool” : { “must” : [ {“range” : {“price” : {“from” : ?, “to” : null, “include_lower” : true, “include_upper” : true } } } ] } }}
LikefindByNameLike
StartingWithfindByNameStartingWith{ “query” : { “bool” : { “must” : [ { “query_string” : { “query” : “?*”, “fields” : [ “name” ] }, “analyze_wildcard”: true } ] } }}
EndingWithfindByNameEndingWith{ “query” : { “bool” : { “must” : [ { “query_string” : { “query” : “*?”, “fields” : [ “name” ] }, “analyze_wildcard”: true } ] } }}
Contains/ContainingfindByNameContaining{ “query” : { “bool” : { “must” : [ { “query_string” : { “query” : “?”, “fields” : [ “name” ] }, “analyze_wildcard”: true } ] } }}
In (when annotated as FieldType.Keyword)findByNameIn(Collectionnames){ “query” : { “bool” : { “must” : [ {“bool” : {“must” : [ {“terms” : {“name” : [“?”,“?”]}} ] } } ] } }}
InfindByNameIn(Collectionnames){ “query”: {“bool”: {“must”: [{“query_string”:{“query”: “”?" “?”", “fields”: [“name”]}}]}}}
NotIn(when annotated as FieldType.Keyword)findByNameNotIn(Collectionnames) { “query” : { “bool” : { “must” : [ {“bool” : {“must_not” : [ {“terms” : {“name” : [“?”,“?”]}} ] } } ] } }}
NotInfindByNameNotIn(Collectionnames){“query”: {“bool”: {“must”: [{“query_string”: {“query”: “NOT(”?" “?”)", “fields”: [“name”]}}]}}}
NearfindByStoreNearNot Supported Yet !
TruefindByAvailableTrue{ “query” : { “bool” : { “must” : [ { “query_string” : { “query” : “true”, “fields” : [ “available” ] } } ] } }}
FalsefindByAvailableFalse{ “query” : { “bool” : { “must” : [ { “query_string” : { “query” : “false”, “fields” : [ “available” ] } } ] } }}
OrderByfindByAvailableTrueOrderByNameDesc{ “query” : { “bool” : { “must” : [ { “query_string” : { “query” : “true”, “fields” : [ “available” ] } } ] } }, “sort”:[{“name”:{“order”:“desc”}}] }

按接口的命名方法示例:
5.1.4

5.1.7 创建索引

@SpringBootTest(classes = EsApplication.class)
@RunWith(SpringRunner.class)
public class EsXcCourseTest {
	@Autowired
	ElasticsearchTemplate elasticsearchTemplate;


	@Test
	public void createIndex(){
		// 创建索引,会根据Item类的@Document注解信息来创建
		boolean createFlag = elasticsearchTemplate.createIndex(EsXcCourse.class);
		System.out.println("####:"+createFlag);
		// 配置映射,会根据Item类中的id、Field等字段来自动完成映射
		elasticsearchTemplate.putMapping(EsXcCourse.class);
	}

}

5.1.8 高级查询

Data ElasticSearch 支持了一些常见的查询
但是一些高级查询呢?可以使用类组装DSL语法支持

 /**
     * 聚合查询-groupBy
     * 聚合所有的年龄
     */
    @Test
    public void groupByAge() {
	//1.构建查询对象
	NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
	nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("groupByAge")
		.field("age").size(30));
	SearchHits<EmployeeInfo> search = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), EmployeeInfo.class);

	Aggregations aggregations = search.getAggregations();

	//解析聚合分组后结果数据
	ParsedLongTerms parsedLongTerms = aggregations.get("groupByAge");
	//groupBy后的年龄集
	List<String> ageList = parsedLongTerms.getBuckets().stream().map(Terms.Bucket::getKeyAsString).collect(Collectors.toList());
	System.out.println(ageList);
    }
/**
 * 分页查询
 * 带参数
 */
@Test
public void listPageMatch() {
    int pageNo = 1;
    int pageSize = 5;

    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
    nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("name", "小"));

    //注:Pageable类中 pageNum需要减1,如果是第一页 数值为0
    Pageable pageable = PageRequest.of(pageNo - 1, pageSize);
    nativeSearchQueryBuilder.withPageable(pageable);

    SearchHits<EmployeeInfo> searchHitsResult = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), EmployeeInfo.class);
    //7.获取分页数据
    SearchPage<EmployeeInfo> searchPageResult = SearchHitSupport.searchPageFor(searchHitsResult, pageable);


    System.out.println("分页查询");
    System.out.println(String.format("totalPages:%d, pageNo:%d, size:%d", searchPageResult.getTotalPages(), pageNo, pageSize));
    System.out.println(JSON.toJSONString(searchPageResult.getSearchHits(), SerializerFeature.PrettyFormat));
}

5.1.9 gitee地址

传送门

5.1.10 参考文章:

SpringBoot-starter-data整合Elasticsearch

5.2 elasticsearch-rest-high-level-client

5.2.1 引入依赖

<dependency>
			<groupId>org.elasticsearch</groupId>
			<artifactId>elasticsearch</artifactId>
			<version>7.6.2</version>
		</dependency>
		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-client</artifactId>
			<version>7.6.2</version>
		</dependency>

		<!-- high-level client ,默认依赖的elasticsearch存在版本差异,排除后添加统一的es版本-->
		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-high-level-client</artifactId>
			<version>7.6.2</version>
			<!--<exclusions>
				<exclusion>
					<groupId>org.elasticsearch</groupId>
					<artifactId>elasticsearch</artifactId>
				</exclusion>
			</exclusions>-->
		</dependency>

5.2.2 配置

yml配置:

elasticsearch:
    hostlist: ${eshostlist:127.0.0.1:9201,127.0.0.1:9202,127.0.0.1:9203,} #多个结点中间用逗号分隔

配置类:

@Slf4j
@Configuration
public class ElasticsearchConfig {
	@Value("${elasticsearch.hostlist}")
	private String hostlist;
	@Bean
	public RestHighLevelClient restHighLevelClient(){
		//解析hostlist配置信息
		String[] split = hostlist.split(",");
		//创建HttpHost数组,其中存放es主机和端口的配置信息
		HttpHost[] httpHostArray = new HttpHost[split.length];
		for(int i=0;i<split.length;i++){
			String item = split[i];
			httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");
		}
		//创建RestHighLevelClient客户端
		return new RestHighLevelClient(RestClient.builder(httpHostArray));
	}

	//项目主要使用RestHighLevelClient,对于低级的客户端暂时不用
	@Bean
	public RestClient restClient(){
		//解析hostlist配置信息
		String[] split = hostlist.split(",");
		//创建HttpHost数组,其中存放es主机和端口的配置信息
		HttpHost[] httpHostArray = new HttpHost[split.length];
		for(int i=0;i<split.length;i++){
			String item = split[i];
			httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");
		}
		return RestClient.builder(httpHostArray).build();
	}
}

5.2.3 操作

@RestController
@RequestMapping("/demo")
@Slf4j
public class DemoController {
	@Autowired
	RestHighLevelClient restHighLevelClient;
	@RequestMapping("/test")
	public String test() throws IOException {
		// 1 创建检索请求
		SearchRequest searchRequest = new SearchRequest("xc_course");
		// 指定索引
		//searchRequest.indices("global_search_index");
		// 构造检索条件 DSL
		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

		/*sourceBuilder.query(); 匹配查询
	    sourceBuilder.from(); 分页查询 from 起始,size 尺寸
	    sourceBuilder.size();
	    sourceBuilder.aggregation(); 聚合
		*/
		//全文检索
		//MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "java");
		//精准搜索
		//TermQueryBuilder queryBuilder = QueryBuilders.termQuery("name", "java");
		TermQueryBuilder queryBuilder=QueryBuilders.termQuery("studymodel","201002");
		sourceBuilder.query(queryBuilder);

		System.out.println(sourceBuilder.toString());
		searchRequest.source(sourceBuilder);
		// 2 执行检索
		SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
		// 3 分析响应结果
		System.out.println("========:"+response.toString());
		return response.toString();
	}

	@RequestMapping("/test2")
	public String test2() throws IOException {
		// 1 创建检索请求
		SearchRequest searchRequest = new SearchRequest("xc_course");
		// 指定索引
		//searchRequest.indices("global_search_index");
		// 构造检索条件 DSL
		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
		//TermQueryBuilder queryBuilder=QueryBuilders.termQuery("studymodel","201002");
		MatchAllQueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
		sourceBuilder.query(queryBuilder);

		System.out.println(sourceBuilder.toString());
		searchRequest.source(sourceBuilder);
		// 2 执行检索
		SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
		// 3 分析响应结果
		System.out.println("========:"+response.toString());
		return response.toString();
	}

	@RequestMapping("/test3")
	public String test3() throws IOException {
		// 1 创建检索请求
		SearchRequest searchRequest = new SearchRequest("logstash-test");
		// 指定索引
		//searchRequest.indices("global_search_index");
		// 构造检索条件 DSL
		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
		//TermQueryBuilder queryBuilder=QueryBuilders.termQuery("studymodel","201002");
		MatchAllQueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
		sourceBuilder.query(queryBuilder);

		System.out.println(sourceBuilder.toString());
		searchRequest.source(sourceBuilder);
		// 2 执行检索
		SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
		// 3 分析响应结果
		System.out.println("========:"+response.toString());
		return response.toString();
	}
}

5.2.3 gitee地址

传送门

5.2.4 参考文章:

参考文章
elasticsearch-rest-high-level-client操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源多商户商城源码代码分析

如今&#xff0c;互联网几乎普及到了所有地区&#xff0c;同时也推动了传统行业发展。目前&#xff0c;越来越多的线下商家开始搭建多商户商城系统&#xff0c;打造属于自己的淘宝、天猫电商服务平台。什么是多商户商城系统呢&#xff1f;想必大部分人并不是很了解&#xff0c;…

多线程基本概念

多线程多线程基本概念线程控制创建终止等待分离线程安全基本概念实现互斥互斥锁死锁同步线程应用生产者与消费者模型线程池单例模式多线程基本概念 线程是进程中一个执行流程&#xff0c;是 CPU 进行执行调度的基本单元&#xff1b; 进程是系统进行资源分配的基本单元。 Linu…

SpringBoot很熟?那手撕一下自定义启动器吧

一. 前言 哈喽&#xff0c;大家好&#xff0c;不知道你有没有想辉哥呢&#xff1f;我可是很想你们哟&#xff01;最近金九银十&#xff0c;又有不少小伙伴私信辉哥&#xff0c;说自己在面试时被问到SpringBoot如何自定义启动器&#xff0c;结果自己不知道该怎么回答。那么今天…

maltose-BSA 麦芽糖-牛血清白蛋白 BSA-PEG-maltose,牛血清白蛋白-PEG-麦芽糖

maltose-BSA 麦芽糖-牛血清白蛋白 BSA-PEG-maltose,牛血清白蛋白-PEG-麦芽糖 中文名称&#xff1a;麦芽糖-牛血清白蛋白 英文名称&#xff1a;maltose-BSA 纯度&#xff1a;95% 别称&#xff1a;牛血清白蛋白修饰麦芽糖&#xff0c;BSA-麦芽糖 麦芽糖-聚乙二醇-牛血清白…

设计模式日常学习(七)

6.5 状态模式 6.5.1 概述 【例】通过按钮来控制一个电梯的状态&#xff0c;一个电梯有开门状态&#xff0c;关门状态&#xff0c;停止状态&#xff0c;运行状态。每一种状态改变&#xff0c;都有可能要根据其他状态来更新处理。例如&#xff0c;如果电梯门现在处于运行时状态…

什么是副业思维,副业应该怎么做,用创业思维分析副业的可行性

副业其实也算是创业的一种&#xff0c;他考量的不仅仅是自身的知识储备&#xff0c;还有你对市场的看法&#xff0c;再加上一定的做副业的技巧&#xff0c;下面分享七个做好副业的技巧​。 1.循序渐进投入 不要大量投资。首先&#xff0c;使用相对较轻的方法来验证创业理念是否…

教程六 在Go中使用Energy创建跨平台GUI - 应用下载事件

教程-示例-文档 介绍 Energy应用下载文件时触发的下载事件和使用 我们在页面上下载文件时&#xff0c;可以对文件下载时的处理&#xff0c;例如&#xff1a;保存路径&#xff0c;下载取消&#xff0c;开始、暂停。 下面将用代码和注释&#xff0c;和简要的说明来演示 Go代码…

GUI编程--PyQt5--布局管理

文章目录布局管理布局步骤QHBoxLayout & QVBoxLayoutQFormLayoutQGridLayout布局管理 布局&#xff0c;按照一定规则&#xff0c;将子控件放入父控件 手动布局&#xff1b;绝对布局move & resize & resizeEvent布局管理器&#xff0c;实现快速布局&#xff0c;是…

08 SQL优化

上一篇文章记录了索引的创建、使用、设计&#xff0c;除了索引方面还需要注意平日对于SQL的使用&#xff0c;对SQL进行优化&#xff1b;SQL的优化是建立在索引使用的基础上 这篇笔记将从以下7个方面对SQL进行优化。 1. 插入数据 使用批量插入,避免循环单条插入 注意批量插入不…

贤鱼的刷题日常(数据结构栈学习)--P1175 表达式的转换--题目详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;例题讲解P1175 表达式的转换 ✅创作者&#xff1a;贤鱼 ⏰预计时间&#xff1a;25分钟 &#x1f389;个人主页&#xff1a;贤鱼的个人主页 &#x1f525;专栏系列&#xff1a;c &#x1f341;贤鱼的个人社区&#xff0c;欢…

ServletConfig 和 ServletContext

1 ServletConfig 1.1 ServletConfig 介绍 ServletConfig 是 Servlet 的配置参数对象&#xff0c;在 Servlet 的规范中&#xff0c;允许为每一个 Servlet 都提供一些初始化的配置。所以&#xff0c;每个 Servlet 都有一个自己的 ServletConfig。作用&#xff1a;在 Servlet 的…

静息态fMRI中的非线性功能网络连接

在这项工作中&#xff0c;我们关注功能网络中的显式非线性关系。我们介绍了一种使用归一化互信息(NMI)计算不同大脑区域之间非线性关系的技术。我们使用模拟数据演示了我们提出的方法&#xff0c;然后将其应用到Damaraju等人先前研究过的数据集。静息状态fMRI数据包括151名精神…

玩转高并发,17年开发经验架构师,历时三年编写Java高并发三部曲

前言 5G&#xff0c;IO&#xff0c;多屏合一&#xff0c;方物互联时代来了&#xff01;太分n式、高并发、微服务架构己经成为Java后端应用的主流架构。但是对Java高并发&#xff0c;springcloudRPC底层原理、Nginx底层原理等核心知识&#xff0c;广大的Java开发同学们相对欠缺…

【踩坑汇总】CLion开启QT编程

一下全部内容全都是大佬lht的经验&#xff0c;我只是记录一下给大家。 问题&#xff1a;Qt5Config.cmake找不到 解决办法&#xff1a; set(CMAKE_PREFIX_PATH "E:/Qt/Qt5.12.11/5.12.11/mingw73_64/lib/cmake/Qt5") 找到Qt5Config.cmake路径&#xff0c;添加上面这…

东南亚LazadaShopee文具类目好做吗?一文带你了解各国热销及需求品类

在东南亚&#xff0c;消费者刚刚经历完双11独有的“速度与激情”——11月11日00&#xff1a;11&#xff0c;开售11分钟&#xff0c;Lazada平台的销售额相比日销暴涨124倍&#xff1b;早上8&#xff1a;17&#xff0c;第一单跨越重洋的中国跨境商品就已成功送达签收。 东南亚&a…

Listen,Attend,and Spell(LAS)——李宏毅人类语言处理学习笔记3

Listen Encoder目标&#xff1a; 去掉noises&#xff0c;提取出相关信息 encoder有很多做法&#xff1a; CNN见文章&#xff1a;CNN-卷积神经网络 self-attention见文章self-attention Pyramid RNN将两个结合&#xff0c;然后送到下一层。Pooling over time则是两个中取一…

代谢组学文献分享:地中海饮食、血浆代谢组和心血管疾病风险

​全球三分之一的死亡由心血管疾病造成&#xff0c;2015-2020年美国膳食指南建议&#xff0c;地中海饮食是预防心血管疾病的一项重要且具有成本效益的战略措施。代谢组学文献分享&#xff0c;发表在期刊European Heart Journ-al&#xff08;IF 22.637&#xff09;上题目为“Th…

网络协议

网络通信协议&#xff1a;计算机网络中实现通信必须有一些约定&#xff0c;即通信协议&#xff0c;对速率、传输代码、代 码结构、传输控制步骤、出错控制等制定标准。 问题&#xff1a;网络协议太复杂&#xff1a;计算机网络通信涉及内容很多&#xff0c;比如指定源地址和目标…

【多标签, 极限的多标签算法】评价指标梳理

具体研究多标签和极限多标签 (XML) 的时候, 合理使用评价指标是关键. 最近在研究极限多标签算法的时候发现了它和传统多标签算法的评价指标是有异的, 而且我曾经积累的传统多标签评价指标也没有一个系统的体系 (很混乱). 于是写下本文用于自我总结. 查询目录<想看什么直接通…

语音识别翻译怎么做?这些方法值得收藏

随着网络的不断发展&#xff0c;我们可以通过网络与世界各地的网友进行聊天。小伙伴们平时会和外国人交流吗&#xff1f;如果是文字聊天&#xff0c;我们看不懂的时候&#xff0c;还可以直接复制文字进行翻译。那如果外国网友发了段语音&#xff0c;结果我们大部分内容听不懂的…