购物网站开发的背景和意义,国外免费推广网站有哪些,深圳市公司排名,免费软件下载平台简介
Elasticsearch 是 Elastic Stack 核心的分布式搜索和分析引擎。 Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。 Kibana 使您能够以交互方式探索、可视化和分享对数据的见解#xff0c;并管理和监控堆栈。 Elasticsearch 可以快速索…简介
Elasticsearch 是 Elastic Stack 核心的分布式搜索和分析引擎。 Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。 Kibana 使您能够以交互方式探索、可视化和分享对数据的见解并管理和监控堆栈。 Elasticsearch 可以快速索引、搜索和分析海量数据。 Elastic 的底层是开源库 Lucene。但是你没法直接用 Lucene必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装提供了 REST API 的操作接口开箱即用。 官方文档(推荐)官方文档链接 官方中文官方中文文档链接 社区中文xiaoleilu.com、codingdict.com
一、基本概念
1、Index索引
动词相当于 MySQL 中的 insert 名词相当于 MySQL 中的 Database。
2、Type类型
在 Index索引中可以定义一个或多个类型。类似于 MySQL 中的 Table同种类型的数据放在一起。
3、Document文档
保存在某个索引Index下某种类型Type的一个数据Document文档是 JSON 格式的Document 就像是 MySQL 中的某个 Table 里面的内容。
二、Docker 安装 Es
1、下载镜像文件
docker pull elasticsearch:8.12 存储和检索数据 docker pull kibana:8.12 可视化检索数据
2、创建实例
1.ElasticSearch
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo http.host: 0.0.0.0 /mydata/elasticsearch/config/elasticsearch.yml
chmod -R 777 /mydata/elasticsearch/ #保证权限
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e discovery.typesingle-node \
-e ES_JAVA_OPTS-Xms64m -Xmx512m \ #设置初始内存和占用最大内存
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:8.12 2.Kibana
docker run --name kibana -e ELASTICSEARCH_HOSTShttp://xxx:9200 -p 5601:5601 \
-d kibana:8.12
#xxx为自己的虚拟机地址三、初步检索
1、_cat
GET /_cat/nodes查看所有节点
GET /_cat/health查看 es 健康状况
GET /_cat/master查看主节点
GET /_cat/indices查看所有索引 show databases2、索引一个文档保存
在 customer 索引下的 external 类型下保存 1 号数据为:
POST customer/external/1
{
name: John Doe
}
#PUT 和 POST 都可以
#POST 新增。如果不指定 id会自动生成 id。指定 id 就会修改这个数据并新增版本号
#PUT 可以新增可以修改。PUT 必须指定 id由于 PUT 需要指定 id我们一般都用来做修改
#操作不指定 id 会报错。3、查询文档
GET customer/external/1 结果
{ _index: customer, //在哪个索引_type: external, //在哪个类型_id: 1, //记录 id_version: 2, //版本号_seq_no: 1, //并发控制字段每次更新就会1用来做乐观锁_primary_term: 1, //同上主分片重新分配如重启就会变化found: true, _source: { //真正的内容name: John Doe}
}4、更新文档
POST customer/external/1/_update
{ doc:{ name: John Doew}
}
或者
POST customer/external/1
{ name: John Doe2
}
或者
PUT customer/external/1
{ name: John Doe
}不同POST 操作会对比源文档数据如果相同不会有什么操作文档 version 不增加PUT 操作总会将数据重新保存并增加 version 版本带_update 对比元数据如果一样就不进行任何操作。 看场景 对于大并发更新不带 _update 对于大并发查询偶尔更新带 _update对比更新重新计算分配规则。
5、删除文档索引
DELETE customer/external/1 DELETE customer
6、bulk 批量 API
POST customer/external/_bulk
{index:{_id:1}}
{name: John Doe }
{index:{_id:2}}
{name: Jane Doe }
#语法格式
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n四、进阶索引
1、SearchAPI
ES 支持两种基本方式检索 :
一个是通过使用 REST request URI 发送搜索参数uri检索参数另一个是通过使用 REST request body 来发送它们uri请求体
检索信息
请求参数方式检索
GET bank/_search?q*sortaccount_number:asc
#响应结果解释
took - Elasticsearch 执行搜索的时间毫秒
time_out - 告诉我们搜索是否超时
_shards - 告诉我们多少个分片被搜索了以及统计了成功/失败的搜索分片
hits - 搜索结果
hits.total - 搜索结果
hits.hits - 实际的搜索结果数组默认为前 10 的文档
sort - 结果的排序 key键没有则按 score 排序
score 和 max_score –相关性得分和最高得分全文检索用uri请求体进行检索
GET bank/_search
{ query: { match_all: {}},sort: [{ account_number: { order: desc}}]
}2、Query DSL
(1) 基本语法格式 Elasticsearch 提供了一个可以执行查询的 Json 风格的 DSLdomain-specific language 领域特定语言。这个被称为 Query DSL。该查询语言非常全面并且刚开始的时候感觉有点复杂真正学好它的方法是从一些基础的示例开始的。
一个查询语句 的典型结构:
{QUERY_NAME: {ARGUMENT: VALUE, ARGUMENT: VALUE,... }
}如果是针对某个字段那么它的结构如下
{QUERY_NAME: {FIELD_NAME: {ARGUMENT: VALUE, ARGUMENT: VALUE,... }}
}比如
GET bank/_search
{ query: { match_all: {}},from: 0, size: 5, sort: [{ account_number: { order: desc}}]
}其中:
query 定义如何查询match_all 查询类型【代表查询所有的所有】es 中可以在 query 中组合非常多的查询类型完成复杂查询除了 query 参数之外我们也可以传递其它的参数以改变查询结果。如 sortsizefromsize 限定完成分页功能sort 排序多字段排序会在前序字段相等时后续字段内部排序否则以前序为准
其他常用的语法比如 match【匹配查询】 match_phrase【短语匹配】 multi_match【多字段匹配】 bool【复合查询】 filter【结果过滤】 term【全文检索字段用 match其他非 text 字段匹配用 term。】 aggregations【执行聚合】最简单的聚合方法大致等于 SQL GROUPBY 和 SQL 聚合函数 具体使用方法见官网ElasticSearch官方文档链接
3、分词
一个 tokenizer分词器接收一个字符流将之分割为独立的 tokens词元通常是独立的单词然后输出 tokens 流。例如whitespace tokenizer 遇到空白字符时分割文本。它会将文本 “Quick brown fox!” 分割为 [Quick, brown, fox!]。该tokenizer分词器还负责记录各个 term词条的顺序或 position 位置用于 phrase 短语和 word proximity 词近邻查询以及 term词条所代表的原始 word单词的 start 起始和 end结束的 character offsets字符偏移量用于高亮显示搜索的内容。Elasticsearch 提供了很多内置的分词器可以用来构建 custom analyzers自定义分词器。 1安装 ik 分词器 进入 es 容器内部 plugins 目录
docker exec -it 容器 id /bin/bash
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-anal
ysis-ik-7.4.2.zip
unzip 下载的文件
rm –rf *.zip
mv elasticsearch/ ik
以确认是否安装好了分词器
cd ../bin
elasticsearch plugin list即可列出系统的分词器2测试分词器 使用默认请观察结果
POST _analyze
{ text: 我是中国人
}使用分词器请观察结果
POST _analyze
{ analyzer: ik_smart, text: 我是中国人
}具体使用技巧参考以下链接ik分词器github链接
五、Elasticsearch-Rest-Client
1、9300TCP spring-data-elasticsearch:transport-api.jar
springboot 版本不同 transport-api.jar 不同不能适配 es 版本7.x 已经不建议使用8 以后就要废弃
2、9200HTTP
JestClient非官方更新慢RestTemplate模拟发 HTTP 请求ES 很多操作需要自己封装麻烦HttpClient同上Elasticsearch-Rest-Client官方 RestClient封装了 ES 操作API 层次分明上手简单
最终选择 Elasticsearch-Rest-Clientelasticsearch-rest-high-level-client https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html
1、SpringBoot 整合
dependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-high-level-client/artifactIdversion8.12/version
/dependency2、配置
Bean
RestHighLevelClient client() {
RestClientBuilder builder RestClient.builder(new HttpHost(自己的虚拟机地址, 9200, http));return new RestHighLevelClient(builder);
}3、使用
参照官方文档
Test
void test1() throws IOException {Product product new Product();product.setSpuName(华为);product.setId(10L);IndexRequest request new IndexRequest(product).id(20).source(spuName,华为,id,20L);try {IndexResponse response client.index(request, RequestOptions.DEFAULT);System.out.println(request.toString());IndexResponse response2 client.index(request, RequestOptions.DEFAULT);} catch (ElasticsearchException e) {if (e.status() RestStatus.CONFLICT) {}}
}