互联网框架day17(es搜索功能的实现 mq秒杀)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

索引的创建

package cn.tedu.es.test;
/**
 * 测试transport客户端连接es操作
 * @author 在路上
 *
 */

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;

import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.client.AdminClient;
import org.elasticsearch.client.IndicesAdminClient;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Before;
import org.junit.Test;

public class EsTest {
	/*
	 * 初始化一个连接对象
	 */
	private TransportClient client;
	@Before
	public void initClient() throws Exception{
		//提供一个连接es的信息 ip:port
		//准备一个配置对象,可以设置当前客户端连接的
		//集群名称elasticsearch
		Settings set=Settings.builder().put("cluster.name","elasticsearch").build();
		client=new PreBuiltTransportClient(set);
		//为client赋值 底层使用的prepare预包装,提供ip地址和端口
		InetSocketTransportAddress ista1=
				new InetSocketTransportAddress(
						InetAddress.getByName("192.168.253.129"),
						9300);//代码插件,客户端连接es使用的9300
		InetSocketTransportAddress ista2=
				new InetSocketTransportAddress(
						InetAddress.getByName("192.168.253.130"),
						9300);//代码插件,客户端连接es使用的9300
		InetSocketTransportAddress ista3=
				new InetSocketTransportAddress(
						InetAddress.getByName("192.168.253.131"),
						9300);//代码插件,客户端连接es使用的9300
		//交给client使用的三个地址对象
		//只要能联通一个节点就可以操作es
		client.addTransportAddress(ista1);
		client.addTransportAddress(ista2);
		client.addTransportAddress(ista3);
	}
	
	//通过利用client对象操作索引相关
	@Test
	public void indexManage(){
		//transportClient使用pre**实现方式,将所有
		//访问的功能,都封装成单独的request和response对象
		//首先需要在代码中封装对应功能的request对象,利用client请求和接收响应
		
		//创建索引,需要先获取索引的管理对象
		AdminClient admin=client.admin();
		IndicesAdminClient indices=admin.indices();
		//新建索引 看不到代码的请求方式 看不到url
		//prepare前缀的方法都是获取一个request对象
		CreateIndexRequestBuilder request = indices.prepareCreate("index07");
		CreateIndexResponse response = request.get();//代码端才发起请求到es
		response.isAcknowledged();
		response.isShardsAcked();
		response.remoteAddress();//看当前请求到底是哪个es节点返回的消息
		
		//对索引的其它操作
		indices.prepareDelete("11");
		indices.prepareExists("11");
		
	}
	
}

//文档操作
	@Test
	public void documentManage(){
		/*//获取文档,索引名称,类型名,索引id
		GetRequestBuilder request=client.prepareGet("index06","article","2");
		//获取响应结果
		GetResponse response=request.get();
		//将获取的document所有数据封装了json字符串
		response.getSource();
		Map<String, Object> map = response.getSourceAsMap();
		System.out.println("id"+map.get("id"));
		//{id=2,title=java,content=ssffs}
		String json=response.getSourceAsString();
		System.out.println(json);*/
		//删除document
		//client.prepareDelete(index,type,id);
		//新增document
		//测试 如何从数据库获取product  利用客户端将数据写入es
		Product p=new Product();
		p.setProductCategory("123");
		p.setProductDescription("dsfa");
		p.setProductId("sdf");
		p.setProductImgurl("sfd");
		p.setProductName("三星固态");
		p.setProductNum(55);
		p.setProductPrice(55.5);
		IndexRequestBuilder request02 = client.prepareIndex("index06", "product", p.getProductId());
		//request中添加发送到索引的document内存数据
		ObjectMapper mapper=new ObjectMapper();
		try {
			String pJson = mapper.writeValueAsString(p);
			request02.setSource(pJson);
			IndexResponse iResponse = request02.get();
		} catch (Exception e) {
			
		}
	}
	
	
	@Test
	public void queryManage(){
		//client调用创建的搜索条件query,设置分页进行搜索
		MatchQueryBuilder query = QueryBuilders.matchQuery("productName", "三星");
		//client调用搜索实现数据的获取
		SearchRequestBuilder request = client.prepareSearch("index06");
		//from 相当于sql分页查询的start起始位置
		//size 相当于rows  page=1  rows=5  0,5  page=2  rows=5  5,5 
		SearchResponse response = request.setQuery(query).setFrom(0).setSize(5).get();
		SearchHits hits = response.getHits();
		System.out.println(hits.totalHits);
		System.out.println(hits.maxScore());
		
		SearchHit[] hits2 = hits.getHits();
		for (SearchHit hit : hits2) {
			String json=hit.getSourceAsString();
			System.out.println(json);
		}
		
	}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.3页面搜索功能
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package cn.tedu.search.config;

import java.net.InetAddress;
import java.util.List;

import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 通过属性读取,封装es客户端
 * transportclient提供给各个服务
 * @author 在路上
 *
 */
@Configuration
@ConfigurationProperties(prefix="easymall.es")
public class ESConfig {
	//集群名称
	private String clusterName;
	//节点连接node信息
	private List<String> nodes;
	//初始化方法对象
	@Bean
	public TransportClient initTransportClient(){
		try {
			//提供一个连接es的信息 ip:port
			//准备一个配置对象,可以设置当前客户端连接的
			//集群名称elasticsearch
			Settings set=Settings.builder().put("cluster.name",clusterName).build();
			TransportClient client=new PreBuiltTransportClient(set);
			for(String node:nodes){
				//
				String host=node.split(":")[0];
				int port=Integer.parseInt(node.split(":")[1]);
				InetSocketTransportAddress ista1=
						new InetSocketTransportAddress(
								InetAddress.getByName(host),
								port);//代码插件,客户端连接es使用的9300
				//交给client使用的三个地址对象
				//只要能联通一个节点就可以操作es
				client.addTransportAddress(ista1);
			}
			return client;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		
	}
	
	public String getClusterName() {
		return clusterName;
	}
	public void setClusterName(String clusterName) {
		this.clusterName = clusterName;
	}
	public List<String> getNodes() {
		return nodes;
	}
	public void setNodes(List<String> nodes) {
		this.nodes = nodes;
	}
	
	
	
}

在这里插入图片描述

package cn.tedu.search.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.jt.common.pojo.Product;

import cn.tedu.search.service.SearchService;

@RestController
public class SearchController {
	@Autowired
	private SearchService searchService;
	@RequestMapping("search/manage/query")
	public List<Product> searchByName(String query,Integer page,Integer rows){
		return searchService.searchbyName(query,page,rows);
	}
}

package cn.tedu.search.service;

import java.util.ArrayList;
import java.util.List;

import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jt.common.pojo.Product;
import com.jt.common.utils.MapperUtil;

@Service
public class SearchService {
	@Autowired
	private TransportClient client;
	public List<Product> searchbyName(String text, Integer page, Integer rows) {
		//创建query对象,封装查询条件mathquery
		MatchQueryBuilder query = QueryBuilders.matchQuery("productName", text);
		//根据分页条件创建请求request
		SearchRequestBuilder request = client.prepareSearch("easymall");
		request.setQuery(query).setFrom((page-1)*rows).setSize(rows);
		//发送请求,获取结果集
		SearchResponse response = request.get();
		//解析 封装了hits的list结果集 每个元素中使用source反序列化product对象
		SearchHit[] hits = response.getHits().getHits();
		//准备一个空的list
		List<Product> pList=new ArrayList<Product>();
		for (SearchHit hit : hits) {
			//index  type version source
			String pJson=hit.getSourceAsString();
			try {
				Product product = MapperUtil.MP.readValue(pJson, Product.class);
				pList.add(product);
				
			} catch (Exception e) {
				e.printStackTrace();
				return pList;
			}
		}
		return pList;
		
	}

}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

rabbitmq的安装

下载[估计不行]https://editor.csdn.net/md/?not_checkout=1  看这个
https://www.rabbitmq.com/which-erlang.html

在这里插入图片描述
在这里插入图片描述

erl查看版本
ctrl  加 z退出

在这里插入图片描述
安装socat用最下边的方法【此方法有问题,小心你的虚拟机奔溃】

[root@localhost software]# yum -y install socat
会报错(报文件内容格式错误)
删除原有的文件:

rm -f /etc/yum.repos.d/CentOS-Base.repo

重新下载阿里的:

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

清理缓存:

yum clean all

如果上述方法没有解决,尝试下面:

删除yum.repos.d目录下所有文件

rm -f /etc/yum.repos.d/*  
 重新下载阿里的:

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
清理缓存:

yum clean all

如果还不行($releasever 是获取你centos的版本号的,例如我的centos的版本号为6.7,获取到的为6,但是已经找不到了,所以直接全局改成7即可)
cd /etc/yum.repos.d
vi CentOS-Base.repo
:%s/$releasever/7/g #将文件中$releasever全部改成7
yum clean all && yum makecache # 清除和缓存




.安装socat

socat支持多协议,用于协议处理,端口转发,rabbitmq依赖于socat,因此在安装rabbitmq前要安装socat。

 由于默认的CentOS-Base.repo源中没有socat,所以 yum  install socat会出现以下错误:No package socat available

epel是yum的一个软件源,里面包含了许多基本源里没有的软件

因此,这里安装epel阿里云源,下载新repo 到/etc/yum.repos.d/,根据系统版本选择执行

epel(CentOS7)

执行:wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

epel(CentOS6)

执行:wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

开始安装socat : 

 yum install -y socat

正确安装socat

【erlang明明版本正确报错使用rpm -ivh --nodeps rabbitmq-server-3.6.5-1.noarch.rpm】
1.安装依赖环境
在线安装依赖环境:可能需要花费一些时间

yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz
1
若安装提示:

warning: *: 
Header V4 RSA/SHA256 Signature, key ID a14f4fca: NOKEY
1
2
解决的方法就是在rpm 语句后面加上 –force --nodeps
即原本为 rpm -ivh *.rpm 现在改成 rpm -ivh *.rpm --force --nodeps就可以了。nodeps的意思是忽视依赖关系。因为各个软件之间会有多多少少的联系。有了这两个设置选项就忽略了这些依赖关系,强制安装或者卸载.

2.安装Erlang
# 安装
rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
1
2
3.安装RabbitMQ
# 安装
rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm

# 安装
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
1
2
3
4
5
4.开启管理界面
# 开启管理界面
rabbitmq-plugins enable rabbitmq_management
1
2
5.注意了: 设置配置文件(有可能没有配置文件rabbitmq.config,我当时就是死活找不到这个文件),但是你下载rabbitmq的时候我提供了这个文件,将这个文件丢到这个目录下:
cd /etc/rabbitmq/
1
6.启动(注意关闭防火墙)
service rabbitmq-server start # 启动服务
service rabbitmq-server stop # 停止服务
service rabbitmq-server restart # 重启服务

mq的下载
https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.7

在这里插入图片描述

在这里插入图片描述

[root@localhost04 doc]# cd /usr/share/doc/rabbitmq-server-3.7.7/

在这里插入图片描述

[root@localhost04 rabbitmq-server-3.7.7]# cp rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

在这里插入图片描述
不限制用户的ip地址,否则只允许本地登录

 {loopback_users, []}

开启控制台
rabbitmq-plugins enable rabbitmq_management

在这里插入图片描述

启动的路径
/usr/lib/rabbitmq/bin
[root@localhost04 bin]# ./rabbitmq-server

  ##  ##
  ##  ##      RabbitMQ 3.7.7. Copyright (C) 2007-2018 Pivotal Software, Inc.
  ##########  Licensed under the MPL.  See http://www.rabbitmq.com/
  ######  ##
  ##########  Logs: /var/log/rabbitmq/rabbit@localhost04.log
                    /var/log/rabbitmq/rabbit@localhost04_upgrade.log

              Starting broker...

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
效果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值