1.Spring Data Elasticsearch高级查询
1.1.基本查询
/**
* 高级查询-基本查询
* @return
*/
@RequestMapping("/matchQuery")
public Iterable<Goods> matchQuery(){
//词条查询
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title","手机");
Iterable<Goods> iterable = goodsRepository.search(matchQueryBuilder);
return iterable;
}
1.2.分页查询
/**
* 高级查询-分页查询
*/
//高级查询-分页查询
@RequestMapping("/pageQuery")
public List<Goods> matchPageQuery(){
//构建queryBuilder
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
//设置基础的查询条件
searchQueryBuilder.withQuery(QueryBuilders.termQuery("category","手机"));
//设置分页
int page = 0; //查询的当前页 0表示第一页数据
int size = 3; //每页显示条数
searchQueryBuilder.withPageable(PageRequest.of(page,size));
Page<Goods> search =esRepository.search(searchQueryBuilder.build());
//总条数
System.out.println(search.getTotalElements());
//总页数
System.out.println(search.getTotalPages());
//每页显示条数
System.out.println(search.getSize());
//当前页
System.out.println(search.getNumber());
//获取分页数据
List<Goods> content = search.getContent();
return content;
}
1.3.聚合查询
/**
* 高级查询-聚合查询
*/
@RequestMapping("/matchQueryAgg")
public void matchQueryAgg() {
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 不查询任何结果
queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""},null));
// 1、添加一个新的聚合,聚合类型为terms,聚合名称为brands,聚合字段为brand
queryBuilder.addAggregation(
AggregationBuilders.terms("images").field("image"));
// 2、查询,需要把结果强转为AggregatedPage类型
AggregatedPage<Goods> aggPage = (AggregatedPage<Goods>)
goodsRepository.search(queryBuilder.build());
// 3、解析
// 3.1、从结果中取出名为pimgs的那个聚合,
Terms agg = (Terms) aggPage.getAggregation("images");
// 3.2、获取桶
List<StringTerms.Bucket> buckets = (List<StringTerms.Bucket>)agg.getBuckets();
// 3.3、遍历
for (Terms.Bucket bucket : buckets) {
// 3.4、获取桶中的key,即图片
System.out.println(bucket.getKeyAsString());
// 3.5、获取桶中的文档数量
System.out.println(bucket.getDocCount());
}
}
1.4. 高亮查询
//创建elasticsearch操作类
public interface GoodsRepository extends ElasticsearchRepository<Goods,Long> {
//高亮处理
@Highlight(
fields = {@HighlightField(name = "title"),@HighlightField(name = "brand")},
parameters = @HighlightParameters(preTags = {"<spanstyle='color:red'>"},postTags = {"</span>"})
)
public List<SearchHit<Goods>> findByTitleOrBrand(String title,String brand);
}
@RequestMapping("/findByTitleOrBrand")
public List<Goods> findByTitleOrBrand(){
List<SearchHit<Goods>> list = goodsRepository.findByTitleOrBrand("手机","手机");
List<Goods> highs = new ArrayList<>();
for (SearchHit searchHit:list) {
Goods goods = (Goods) searchHit.getContent();
Map highlightFields = searchHit.getHighlightFields();
List titles = (List) highlightFields.get("title");
if (titles != null){
goods.setTitle((String) titles.get(0));
}
List brands = (List) highlightFields.get("brand");
if (brands != null){
goods.setBrand((String) brands.get(0));
}
highs.add(goods);
}
return highs;
}
2.elasticsearch集群
2.1.搭建集群
Elasticsearch如果做集群的话节点至少三台服务器或者三个实例加入相同集群,三个节点最多只 能故障一台节点,如果故障两个节点,Elasticsearch将无法组成集群.会报错,Kibana也无法启 动,因为Kibana无法获取集群中的节点信息。
由于,我们使用只有一台虚拟机,所以我们在虚拟机中安装三个ES实例,搭建伪集群。
2.1.1.拷贝副本
修改elasticsearch的JVM占用内存参数,防止内存不足错误
vim /opt/elasticsearch/elasticsearch/config/jvm.options
默认情况下,ES启动JVM最小内存1G,最大内存1G
-xms:128m #最小内存
-xmx:128m #最大内存
将opt目录下的elasticsearch安装目录拷贝3个
cd /opt/elasticsearch
cp -r elasticsearch elasticsearch1
cp -r elasticsearch elasticsearch2
cp -r elasticsearch elasticsearch3
2.1.2. 修改elasticsearch.yml配置文件
创建日志目录
cd /opt/elasticsearch
mkdir logs
mkdir data
# 授权给zhangsan用户
chown -R zhangsan:zhangsan ./logs
chown -R zhangsan:zhangsan ./data
chown -R zhangsan:zhangsan ./elasticsearch1
chown -R zhangsan:zhangsan ./elasticsearch2
chown -R zhangsan:zhangsan ./elasticsearch3
分别配置三个节点的elasticsearch.yml配置文件
elasticsearch1配置文件
#集群名称
cluster.name: test-es
#节点名称
node.name: test-1
#是不是有资格主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 3
#ip地址
network.host: 0.0.0.0
#端口
http.port: 9201
#内部节点之间沟通端口
transport.tcp.port: 9700
#es7.x 之后新增的配置,节点发现
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["test-1", "test-2","test-3"]
#数据和存储路径
path.data: /opt/elasticsearch/data
path.logs: /opt/elasticsearch/logs
elasticsearch2配置文件
#集群名称
cluster.name: test-es
#节点名称
node.name: test-2
#是不是有资格主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 3
#ip地址
network.host: 0.0.0.0
#端口
http.port: 9202
#内部节点之间沟通端口
transport.tcp.port: 9800
#es7.x 之后新增的配置,节点发现
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["test-1", "test-2","test-3"]
#数据和存储路径
path.data: /opt/elasticsearch/data
path.logs: /opt/elasticsearch/logs
elasticsearch3 配置文件
#集群名称
cluster.name: test-es
#节点名称
node.name: test-3
#是不是有资格主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 3
#ip地址
network.host: 0.0.0.0
#端口
http.port: 9203
#内部节点之间沟通端口
transport.tcp.port: 9900
#es7.x 之后新增的配置,节点发现
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["test-1", "test-2","test-3"]
#数据和存储路径
path.data: /opt/elasticsearch/data
path.logs: /opt/elasticsearch/logs
2.1.3.执行授权
在root用户下执行
chown -R zhangsan:zhangsan /opt/elasticsearch/elasticsearch1
chown -R zhangsan:zhangsan /opt/elasticsearch/elasticsearch2
chown -R zhangsan:zhangsan /opt/elasticsearch/elasticsearch3
如果有的日志文件授权失败,可使用(也是在root下执行)
cd /opt/elasticsearch/elasticsearch1/logs
chown -R zhangsan:zhangsan ./*
cd /opt/elasticsearch/elasticsearch2/logs
chown -R zhangsan:zhangsan ./*
cd /opt/elasticsearch/elasticsearch3/logs
chown -R zhangsan:zhangsan ./*
2.1.4.启动三个节点
依次启动elasticsearch的三个节点,之后在浏览器中输入http:/192.168.149.135:9201/cat/he
thy,查看集群状态信息
说明集群构建成功。
健康状况结果解释:
cluster 集群名称
status 集群状态
green 代表健康;
yellow 代表分配了所有主分片,但至少缺少一个副本,此时集群
数据仍旧完整:
red 代表部分主分片不可用,可能已经丢失数据。
node.total 代表在线的节点总数量
node.data 代表在线的数据节点的数量
shards 存活的分片数量
pri 存活的主分片数量 正常情况下 shards的数量是pri的两倍。
relo 迁移中的分片数量,正常情况为 0
init 初始化中的分片数量 正常情况为 0
unassign 未分配的分片 正常情况为 0
pending_tasks 准备中的任务,任务指迁移分片等 正常情况为 0
max_task_wait_time 任务最长等待时间
active_shards_percent 正常分片百分比 正常情况为 100%
2.2.使用Kibana配置和管理集群
因为之前我们在单机演示的时候也使用到了Kibana,我们先复制出来一个Kibana,然后修改它 的集群配置
cd /opt/
cp -r kibana-7.4.0-linux-x86_64 kibana-7.4.0-linux-x86_64-cluster
# 由于 kibana 中文件众多,此处会等待大约1分钟的时间
修改Kibana的集群配置
vim kibana-7.4.0-linux-x86_64-cluster/config/kibana.yml
加入下面的配置
elasticsearch.hosts:
["http://localhost:9201","http://localhost:9202","http://localhost:9203"]
启动Kibana
sh kibana --allow-root
打开Kibana,点开 Stack Monitoring 集群监控