- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。可以帮助我们从海量数据中快速找到需要的内容。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的。
概念对比
MySQL | Elasticsearch | 说明 |
---|---|---|
Table | Index | 索引(index),就是文档的集合,类似数据库的表(table) |
Row | Document | 文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式 |
Column | Field | 字段(Field),就是JSON文档中的字段,类似数据库中的列(Column) |
Schema | Mapping | 映射(Mapping)是索引中文档的约束,例如字段类型约束。类似数据库的表结构 |
SQL | DSL | DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD |
优点对比
mapping 是对索引库中文档的约束,常见的mapping属性包括
type:字段类型
字符串:text(可分词的文本)、keyword(精确值,不可拆分的词)
数值:long、integer、short、byte 、double、float
布尔:boolean
日期:date
对象:object
index:是否创建倒排索引,默认为true
analyzer:使用哪种分词器,一般与text联合使用
properties:该字段的子字段
更多mapping属性可查阅Elastic官方文档
创建索引库
【语法】
PUT /索引库名
{
"mappings": {
"properties": {
"字段名1":{
"type": "text",
"analyzer": "ik_smart"
},
"字段名2":{
"type": "object",
"properties": {
"子字段":{
"type": "keyword"
}
}
},
//....
}
}
}
【案例】
查询索引库
【语法】
GET /索引库名
【案例】
GET /why
删除索引库
【语法】
DELETE /索引库名
【案例】
DELETE /why
修改索引库
索引库只能添加新的字段,索引库一旦创建就无法修改
【案例】
PUT /索引库名/_mapping
{
properties: {
"新的字段名": {
"type": "integer"
}
}
}
【案例】
【语法】
POST /索引库名称/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
"字段3": {
"子属性1": "值3",
"子属性2": "值4"
},
//...
}
【案例】
【语法】
GET /索引库/_doc/文档id
【案例】
GET /why/_doc/1
【语法】
DELETE /索引库/_doc/文档id
【案例】
DELETE /why/_doc/1
【全量修改语法】
PUT /索引库名/_doc/文档id
{
"字段1": "值1",
"字段1": "值1",
//...
}
【增量修改语法】
POST /索引库名/_update/文档id
{
"doc": {
"字段名" :"新的值"
}
}
【案例】
两种修改方式的区别
一、导入工程和数据库
本文素材来自黑马张老师的视频
二、引入依赖
<properties>
<java.version>1.8</java.version>
<!--覆盖默认的ES版本-->
<elasticsearch.version>7.12.1</elasticsearch.version>
</properties>
<!--ElasticSearch依赖-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.12.1</version>
</dependency>
</dependencies>
三、初始化JavaRestClient
private RestHighLevelClient client;
@BeforeEach //初始化RestHighLevelClient
void init(){
this.client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://192.168.140.130:9200")
));
}
@AfterEach //关闭资源
void close() throws IOException {
this.client.close();
}
创建索引库
@Test //创建索引库
void testCreateHotelIndex() throws IOException {
//1.创建Request对象
CreateIndexRequest request = new CreateIndexRequest("hotel");
//2.请求参数 source:创建索引库的DSL语句,xContentType:数据类型
request.source(MAPPINF_TEMPLATE,XContentType.JSON);
//3.发送请求,创建索引库
client.indices().create(request, RequestOptions.DEFAULT);
}
判断索引库是否存在
@Test //判断索引库是否存在
void testIsExistHotelIndex() throws IOException {
//1.创建Request对象 参数是要删除索引库的名称
GetIndexRequest request = new GetIndexRequest("hotel");
//3.发送请求,判断索引库是否存在
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println("索引库是否存在:"+exists);
}
删除索引库
@Test //删除索引库
void testDeleteHotelIndex() throws IOException {
//1.创建Request对象 参数是要删除索引库的名称
DeleteIndexRequest request = new DeleteIndexRequest("hotel");
//3.发送请求,删除索引库
client.indices().delete(request, RequestOptions.DEFAULT);
}
添加文档
@Test //添加文档
void testAddIndexDocument() throws IOException {
//在数据库查找数据
Hotel hotel = hotelService.getById(61083L);
//转化为文档类型
HotelDoc hotelDoc = new HotelDoc(hotel);
//1.创建request对象
IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());
//2.准备document文档 将对象序列化成json格式的字符串
String source = JSON.toJSONString(hotelDoc);
request.source(source,XContentType.JSON);
//3.发送请求,添加文档
client.index(request,RequestOptions.DEFAULT);
}
查询文档
@Test //查找文档
void testGetIndexDocument() throws IOException{
GetRequest request = new GetRequest("hotel","61083");
GetResponse documentFields = client.get(request, RequestOptions.DEFAULT);
String json = documentFields.getSourceAsString();
//将json格式的字符串反序列化成对象
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
System.err.println(hotelDoc);
}
更新文档
@Test //这是局部更新文档,全量更新文档代码与添加文档相同
void testUpdateIndexDocument() throws IOException{
UpdateRequest request = new UpdateRequest("hotel","61083");
request.doc(
"price","999",
"score","50"
);
client.update(request,RequestOptions.DEFAULT);
}
删除文档
@Test //删除文档
void deleteIndexDocument() throws IOException{
DeleteRequest request = new DeleteRequest("hotel","61083");
client.delete(request,RequestOptions.DEFAULT);
}
批量导入文档
@Test //批量导入文档
void testMultipleAddIndexDocument() throws IOException{
//从数据库中批量查询数据
List<Hotel> hotels = hotelService.list();
BulkRequest request = new BulkRequest();
for (Hotel hotel : hotels) {
HotelDoc hotelDoc = new HotelDoc(hotel);
request.add(new IndexRequest("hotel")
.id(hotelDoc.getId().toString())
.source(JSON.toJSONString(hotelDoc),XContentType.JSON));
}
client.bulk(request,RequestOptions.DEFAULT);
}
如何将十进制数字转换为mixed radix表示法? 我猜想给定每个基数数组的输入和十进制数,它应该输出每列值的数组。 最佳答案 伪代码: bases = [24, 60, 60] input = 8
我有 Table-A,其中有“x”行。 (对于这个例子有 8 行) 我通过使用游标创建了列数为“x”的Table-C。 (使其动态化;如果将更多行添加到 Table-A,则会在 Table-C 中创建
我有一个关于对象的(很可能是简单而愚蠢的)问题。我创建了实例“Person”的对象“jon”。当我打电话时 console.log(jon.name) 控制台会给我输出“jon”。到目前为止,一切都很
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: javascript function vs. ( function() { … } ()); 抱歉,如果这太基础了
我正在尝试用 Java 重新创建射弹轨迹,但是,我遇到了一些问题。我看过很多解释公式之类的视频,但他们的方程中有一个目标,而我没有。我的意思是,他们有一个范围来计算子弹的下落,但我试图弄清楚子弹最终会
(希望如此)来自一个完整的 Rust 初学者的一个简单问题。我的循环有什么问题? num 计算结果为“69”的速度相当快,但是一旦 num 设置为“69”,循环就永远不会退出。我肯定遗漏了一些明显的东
我在 id="name"的元素上应用“.length”,但它计数为 29 而不是 14。我想知道我的错误在哪里?如果有人可以让我知道,那就太好了。谢谢! var name=document.getEl
我知道这很简单,但由于某种原因我无法让它工作。我正在尝试在 Java 中创建自定义颜色,但它似乎不起作用。 import java.awt.Color; Color deepGreen = new C
我有一个大文件,其中每一行都包含一个子字符串,例如 ABC123。如果我执行 grep ABC file.txt 或 grep ABC1 file.txt 我按预期返回这些行,但如果我执行 grep
我想将以下实体映射转换为 Priority 对象。在 getter 上,当我将“Short”更改为“Priority”并遵循 this.priority 时,它会提示 'basic' 属性类型不应该是
我正在开发一个相当基本的函数,我发现很难弄清楚为什么我会得到我的输出。 def mystery(n): print(n) if n < 4: my
我正在尝试对 WordPress 安装的新闻部分实现同位素过滤。我是 JavaScript/jQuery 的新手,正在尝试随时随地学习。我首先使用 Filters section of the Iso
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我在另一个实体类中引用一个实体并收到此错误。下面是示例代码。我在 persistence.xml 中也有这些类。 是什么导致了这个问题?我正在使用 Spring 数据 JPA 和 Hibernate。
我正在解析 HTML 并重新格式化图像以使其更好地适应。由于某种原因,当我有多个图像需要解析时,我会超出范围,而且我一生都无法弄清楚为什么。 当 imgArray.count >1 时,我将使用带有递
我是 SQL 新手,正在尝试创建一个基本的子查询。我需要找出经理的平均年龄和实习生的平均年龄之间的差异。 标题为一栏 - 经理或实习生年龄是一列,全部在同一个表中。 我会使用两个子查询来做类似的事情:
我习惯了 csh,所以不得不使用 bash 有点烦人。这段代码有什么问题? if[$time > 0300] && [$time 和 300 && time < 900 )) then mod
我建立了这个页面:http://excelwrestling.com/poola.php即将到来的双重锦标赛。我的大部分数据都是从我的 mySQL 数据库中提取的,现在只有一些示例数据。 我希望链接选
是否有任何原因导致以下内容不起作用: for (i=0;i < someArray.length;i++) { if (someArray[i].indexOf("something") !=
我现在正在学习 Javascript,有一个问题一直困扰着我! 因此,我在这里所需要做的就是在此输入框中键入颜色,单击按钮并将标题更改为键入的颜色(仅当键入的颜色位于变量中指定的数组中时)。 我的代码
我是一名优秀的程序员,十分优秀!