ElasticSearch

ElasticSearch

版本:ElasticSearch 7.6.1

  1. 分词器 ik
  2. Restful草走
  3. CRUD
  4. SpringBoot集成
  5. 爬虫
  6. 实战,全文检索

Lucene 是一套信息检索工具包,不包含搜索引擎

包含:索引结构工具类。

Lucene 和 ElasticSearch 关系:

Els是基于Lucene 做了封装和增强。

概述

ES,开源的高扩展的分布式全文检索引擎,可以处理PB级别的数据,目的是通过RESTfulAPI来隐藏Lucene的复杂性,让全文搜索变得简单。

简介

实时分布式搜索和分析引擎,用于全文搜索,结构化搜索,分析。

对比solr

  1. 使用简单
  2. 索引增加solr会很慢
  3. es只支持json
  4. es维护很快更新快
  5. es更适合新兴的实时搜索系统

安装

jdk1.8最低要求,客户端,界面工具

华为云镜像下载

可视化界面:es head

界面工具跨域问题配置解决

1
2
http.cors.enabled:true
http.cors.allow-origin:"*"

开始

ELK

elasticsearch、Logstash、Kibana也被称为Elastic Stack。

logstash提供数据源服务

kibana 可视化工具

概念

  1. 索引
  2. 字段类型
  3. 文档

倒排索引

采用Lucene倒排位为底层,适用于快速全文搜索。

不完全搜索全文关键字,获取所有索引(库)比较出现权重,过滤掉无关数据提高效率。es是由多个lucene的索引组合。

IK分词器插件

把一段中文划分成一个个关键字,组合分别搜索

下载ES的IK分词器插件解压到pulg文件下。

ik_smart ik_max_word

可以自己配置dlc文件。

RESTful风格操作

1
2
3
4
5
6
7
8
9
10
11
12
13
Put testdb
{
"mappings":{
"properties":{
"name":{
"type":"text"
},
"desc":{
"type":"keyword"
}
}
}
}

查询

should must_not must 查询条件

filter 查询过滤条件 gt:大于,gte:大于等于,lt:小于,lte:小于等于。

模糊查询tags,可用空格隔开,可以控制_score分权重。

精确查询,term 直接通过倒排索引指定词条惊醒精度查找。

关于分词:

  • term,直接查询精确的
  • match,会使用分词器解析

term:

  • 匹配
  • 按条件匹配
  • 精确匹配
  • 范围匹配
  • 多条件查询
  • 匹配字段过滤

集成Springboot

文档

客户端相关,Java Rest Client。

找maven依赖,使用完需要关闭client.close()。

pom自定义es版本,7.6.1,jdk1.8以上。

编写配置类

1
2
3
4
5
6
7
8
9
10
11
@Configuration
public class ElasticSearchClientConfig{

@Bean
public RestHighLeveClient restHighLevelClient(){
RestHighLevenClient client new Res..(
RestClient.builder(
new HttpHost("127.0.0.1",9200,"http")));
return client;
}
}

分析源码

xxxAutoConfigration xxxProperties

API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Autowired
private RestHighclient client;

//创建索引xxx请求
CreateIndexRequest request = new CreateIndexRequest("xxx");

//客户端执行请求 ,请求后获得响应
CreateIndexResponse createResponse = client.indices().create(request,RequestOptions.DEFAULT);

//测试获取索引xxx
GetIndexRequest request = new GetIndexRequest("xxx");
//判断索引是否存在
client.indices().exists(request,RequestOption.DEFAULT);
//删除索引
DeleteIndexRequest request = new DeleteIndexRequest("xxx");
//判断删除成功
AcknowledgeResponse response = indices().delete(request,RequestOption.DEFAULT);

测试添加

1
2
3
4
5
6
7
8
//创建对象
User user - new User("chen");
//创建请求
IndexRequest request = new Indexrequest("xxx");
//将数据放入请求 json
request.source(JSON.toJSONString(user),XContentType.JSON);
//客户端发送请求获取响应结果
CreateIndexResponse createResponse = client.indices().create(request,RequestOptions.DEFAULT);

获取文档,判断是否存在 get

1
2
3
4
5
//判断1号文档是否存在
GeyRequest getRequest = new GetRequest("xxx","1");
//不获取返回的_source 的上下文
getRequest.fetchSourceContext(new FetchSourceContext(false));
getRequest.storedFields("_nonw_");

获取文档信息

1
2
3
4
GetRequest getRequest = new GetRequest("xxx",1);
GetResponse getResponse = client.get(getRequest,RequestOption.DEFAULT);
//打印文档信息
getResponse,getSourceAsString().sout

更新文档信息

1
2
3
4
5
6
UpdateRequest updateRequest = new UpdateRequest("xxx","1");
User user = new User();
updateRequest.doc(JSON.toJSONSTring(user).XContentType.JSON);

UpdateResponse response = client.update(updateRequest,RequestOption.DEFAULT);
updateResponse.status().sout;

特殊的,一般会批量插入数据

1
2
3
4
5
6
7
8
BulkRequest bulkRequest = new B();
bulkRequest.tiomeout("10s");

userList
//批量更新和批量删除就好
for(i){
bulkRequest.add(new IndexRequest("xxx").id(""+(i+1)).source(JSON.toJSONSrting(userList.get(i),XContentType.JSON));
}

查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
new SeachRequest.var;
//构建搜索条件
new SearchSourceBuilder.var;
//查询条件,使用qb工具
//QuerBuilders.termQuery()精确查询
//matchAllQuery() 匹配所有
QueryBuilders.termQuery("name","chenzhuo").var
sourceBuilder.query(temQueryBuilder);
//设置查询时间
sourceBuilder.timeout(new TimeValue(60,TimeUnit.SECONDS));

searchRequest.source(sourceBuilder);

searchresponse = cilent.search(searchResquest,RequestOption.DEFAULT);
//查询的数据
JSON.toJSONString(searchResponse.getHirs()).sout;

实战使用

解析网页jsoup

tika爬电影,音乐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//获取请求 url
String url = "http://xxx.com";
//解析网页,jsoup返回的document就是浏览器的Document对象
Document document = Jsoup.parse(new URL(url),30000);
//所有在js中使用的方法都可以用
Element element = document.getElementById("div的id");
//获取所有的li元素
element.getElementsByTag("li");
//获取元素内容
for(Element el:elements){
//图片获取不到可能放在懒加载路径中
String img = el.getElementByTag("img").eq(0).attr("src");
String price = el.getElementByClass("p-price").eq(0).text();
}

(待完善。

0%