ElasticSearch概述
ElasticSearch下载、安装、闪退
ElasticSearch7.6.1 (内含代码笔记ElasticSearch.zip)
链接:https://pan.baidu.com/s/1QEKgvSr-7INjwBnO9XbQyg
提取码:kkds
要求:JDK1.8以上
Java开发,ElasticSearch的版本要和Java的核心jar包版本对应
elasticsearch-7.6.1文件下的内容
闪退问题
1.由于启东时默认运行内存为1g,内存不足导致启动失败,修改jvm.options,将1g改为256m
2.运行时出现此类报错,修改elasticsearch.yml文件,添加 xpack.ml.enabled: false 即可
ElasticSearch-head-master 可视化界面
要求:已安装node.js
1.执行 cnpm install 下载依赖
2.执行 npm run start 启动
3.解决跨域问题
配置elasticsearch.yml文件,重新启动
ELK简介
Kibana安装
启动
访问端口5601
开发工具
汉化
配置 kibana.yml 后重启
添加 “zh-CN”
ES核心概念
IK分词器插件
安装
地址: https://github.com/medcl/elasticsearch-analysis-ik.
将ik解压至elasticsearch的plugins文件夹中
重启ES
ik插件被加载
使用kibana测试
ik_smart 最少划分
ik_max_word 最细粒度划分
发现自己需要的词被拆分,需要自己添加到分词器的字典中
在ik分词器中添加自己的配置
在对应文件夹下创建自己的词库
将词典添加至IKAnalyzer.cfg.xml中 重启ES
Rest风格操作
索引的基本操作
1.创建一个索引
PUT /索引名/类型名/文档id
{请求体}
2.创建索引并指定字段类型
3.通过get获得相应的信息
4.查看默认的信息
创建test3索引
默认创建类型
5.修改索引
6.删除索引
文档的基本操作(重点)
基本操作
1.添加数据
put /kaungshen/user/1
{
"name":"狂神说",
"age":"23",
"desc":"你好,世界",
"tags": ["技术宅","温暖","直男"]
}
2.查询数据
3.更新数据PUT
推荐使用 POST 更新方式
post 后面没有 _update 时没有修改的值会为空和put一样
post后面加有 /_update 时 没有修改的值不会空
POST /kaungshen/user/2/_update
{
"doc":{
"name": "酷裤的森"
}
}
复杂操作(重点)
过滤返回结果
排序
分页查询
布尔值查询
must 的作用相当于 and
should 的作用相当于 or
must_not 相当于 not
filter 过滤(gt:大于 lt:小于 gte:大于等于)
匹配多个条件
精确查询
精确查询多个值
高亮查询
Springboot 集成 ElasticSearch
创建springboot项目,记得勾选
配置project环境
创建配置类
@Configuration
public class ElasticSearchClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("127.0.0.1",9200,"http"))
);
return client;
}
}
具体API测试
1.创建、获取、删除索引
/*
* es 7.6.1 高级客户端测试API
* */
@SpringBootTest
class EsApiApplicationTests {
//面向对象操作
@Autowired
@Qualifier("restHighLevelClient") //名称不一致时 要用Qualifier
private RestHighLevelClient client;
//测试索引的创建 Request
@Test
void testCreateIndex() throws IOException {
//1.创建索引请求
CreateIndexRequest request = new CreateIndexRequest("kuang_index");
//2.执行请求,请求后获得响应
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(createIndexResponse);
}
//测试获取索引 只能判断索引存不存在
@Test
void testExistIndex() throws IOException {
GetIndexRequest getIndexRequest = new GetIndexRequest("kuang_index");
boolean exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
//测试删除索引
@Test
void testDeleteIndex() throws IOException {
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("kuang_index");
AcknowledgedResponse delete = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
System.out.println(delete);
}
}
2.文档操作
//测试添加文档
@Test
void testDocument() throws IOException {
//创建对象
User user = new User("狂神说", 3);
//创建请求
IndexRequest request = new IndexRequest("kuang_index");
//规则 put/kuang_index/_doc/1
request.id("1");
request.timeout(TimeValue.timeValueSeconds(1));
//将数据放入请求 数据要转为json字符串 引入fastjson
request.source(JSON.toJSONString(user), XContentType.JSON);
//客户端发送请求,获取响应的结果
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
//获取文档,判断是否存在 get /kuang_index/doc/1
@Test
void testIsExists() throws IOException {
GetRequest getRequest = new GetRequest("kuang_index", "1");
//不获取返回的_source 的上下文
getRequest.fetchSourceContext(new FetchSourceContext(false));
getRequest.storedFields("_none_");
boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
//获取文档的信息
@Test
void testGetDocument() throws IOException {
GetRequest getRequest = new GetRequest("kuang_index", "1");
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsString()); //打印文档的内容
System.out.println(getResponse);
}
//更新文档的信息
@Test
void testUpdateDocument() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("kuang_index", "1");
updateRequest.timeout("1s");
User user = new User("你好", 5);
updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse.status());
}
//删除文档记录
@Test
void testDeleteDocument() throws IOException {
DeleteRequest request = new DeleteRequest("kuang_index", "1");
request.timeout("1s");
DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());
}
//特殊的,真实的项目都会批量插入数据
@Test
void testBulkRequest() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<Object> userList = new ArrayList<>();
userList.add(new User("1",15));
userList.add(new User("2",15));
userList.add(new User("3",15));
userList.add(new User("4",15));
userList.add(new User("5",15));
//批处理请求
for (int i = 0; i < userList.size(); i++) {
bulkRequest.add(
new IndexRequest("kuang_index")
.id(""+(i+1)) //不用id会生成随机id
.source(JSON.toJSONString(userList.get(i)),XContentType.JSON)
);
}
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures()); //是否失败 返回false没有失败
}
//查询
@Test
void testSearch() throws IOException {
SearchRequest searchRequest = new SearchRequest("kuang_index");
//构建搜索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//查询条件 使用QueryBuilders工具类实现
//termQuery 精确匹配
//TermQueryBuilder name = QueryBuilders.termQuery("name", "3");
//匹配所有
MatchAllQueryBuilder allQuery = QueryBuilders.matchAllQuery();
sourceBuilder.query(allQuery);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
//sourceBuilder.from();
//sourceBuilder.size();
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(searchResponse.getHits()));
System.out.println("=========================");
for (SearchHit hit : searchResponse.getHits().getHits()) {
System.out.println(hit.getSourceAsMap());
}
}
实战
1.编写jsoup爬虫工具类,获取信息
public class HtmlParseUtil {
public static void main(String[] args) throws IOException {
new HtmlParseUtil().parseJD("vue").forEach(System.out::println);
}
public List<Content> parseJD(String keywords) throws IOException {
//获取请求 https://search.jd.com/Search?keyword=java
String url="https://search.jd.com/Search?keyword="+keywords;
//解析网页(Jsoup返回Document就是浏览器Document对象)
Document document = Jsoup.parse(new URL(url), 30000);
//所有js中可以使用的方法,这里都可以用
Element element = document.getElementById("J_goodsList");
//System.out.println(element.html());
//获取所有的li元素
Elements li = element.getElementsByTag("li");
ArrayList<Content> goodsList = new ArrayList<>();
//获取元素中的内容
for (Element el : li) {
String img = el.getElementsByTag("img").eq(0).attr("data-lazy-img");
String price = el.getElementsByClass("p-price").eq(0).text();
String title = el.getElementsByClass("p-name").eq(0).text();
// System.out.println("=========================");
// System.out.println(img);
// System.out.println(price);
// System.out.println(title);
Content content = new Content();
content.setImg(img);
content.setPrice(price);
content.setTitle(title);
goodsList.add(content);
}
return goodsList;
}
}
关键字高亮 在index前端页面修改此处