下载地址:Download Elasticsearch | Elastic
浏览器查看启动情况,出现一下内容说明服务已启动
如果启动成功无法访问
- 将xpack.security.enabled: 和xpack.security.http.ssl:enabled: 设置为false即可。设置完了之后重启elasticsearch,然后在进行访问。
elasticsearch-head
ealsticsearch只是后端提供各种api,那么怎么直观的使用它呢?elasticsearch-head将是一款专门针对于elasticsearch的客户端工具, elasticsearch-head配置包
1.下载地址:GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster
2.启动:
npm install
npm run start
3.连接测试发现,存在跨域问题:配置es
http.cors.enabled: true
http.cors.allow-origin: "*"
4.重启es
Kibana
什么是Kibana?
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据,使用Kibana,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解,它操作简单,基于浏览器的用户界面可以快速创建仪表盘,实时显示Elasticsearch查询动态。设置Kibana非常简单,无需编码或者额外的基础架构,几分钟就可以完成
下载对应ElasticSearch版本的Kibana
1.下载地址:Kibana:数据的探索、可视化和分析 | Elastic
2.解压下载的文件(解压需要一定时间)
3.启动Kibana
ik分词器
什么是IK分词器?
即把一段中文或者英文划分成一个个的关键字,我们在搜索的时候会把搜索的内容进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,这显然是不符合要求的,所以我们安装中文分词器ik来解决这个问题
下载对应ElasticSearch版本的分词器
1.下载地址:Releases · medcl/elasticsearch-analysis-ik · GitHub
2. 在elasticsearch/plugins/新建一个ik目录,解压下载的文件
3. 重启elasticsearch,安装了插件,重启比较慢。
4. 测试分词器是否成功
ik提供了两个分词算法:ik_smart和ik_max_word,其中ik_smart为最少切分,ik_max_word为最细粒度划分
- ik_smart
自定义分词器字典
发现问题:"华数云"被拆开了!
这种自己需要的词,需要配置分词器字典:
如何配置?
1.打开刚刚新建的ik文件夹,找到config文件夹
2.在该目录下新建一个xxx.dic字典文件
3.并把自己定义的字典配置到IKAnalyzer.cfg.xml中
4.重启测试
Restful风格操作
1.创建一个索引
PUT /索引名/类型名/文档id
{请求体}
2.获得规则
GET /索引名
3.查询一个索引
-
GET /索引名/_search
根据条件搜索
GET /索引名/类型名/_search?q=属性名:属性值
4.修改一个索引
- 还是使用PUT即可,然后覆盖
5.删除索引
DELETE /索引名
复杂查询
单条件查询
多个以空格隔开
多条件查询
must(and),所有的条件都要符合
should(or),只需要符合一个
must_not(not/!=)
filter 过滤
查询年龄大于25的
指定字段
排序
分页查询
精确查询 term
注意使用term精确查询时数据类型必须是keyword的
name为text类型,默认会进行分词处理,无法精确查询
desc为keyword类型,不会被分词器处理,看成一个整体,实现精确查询
高亮查询
默认是<em>标签
自定义标签,这样前端就能实现高亮显示
集成springboot
依赖
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.6.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.6.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.6.1</version>
</dependency>
配置bean
package com.es.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticSearchClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(RestClient
.builder(new HttpHost("127.0.0.1", 9200, "http")));
return client;
}
}
注意,version需要和Elasticsearch版本一致
编写测试类
package com.es;
import com.alibaba.fastjson.JSON;
import com.es.pojo.User;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@SpringBootTest
@RunWith(SpringRunner.class)
public class EsTest {
@Autowired
private RestHighLevelClient restHighLevelClient;
//索引的创建
@Test
public void testCreateIndex() throws IOException {
//1.创建索引请求
CreateIndexRequest request = new CreateIndexRequest("java_test");
//2.执行创建请求,请求后获得响应
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
System.out.println(createIndexResponse.isAcknowledged());
}
//获取索引,只能判断存不存在
@Test
public void testExistIndex() throws IOException {
GetIndexRequest request = new GetIndexRequest("java_test");
boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
//删除索引
@Test
public void testDeleteIndex() throws IOException {
DeleteIndexRequest request = new DeleteIndexRequest("java_test");
AcknowledgedResponse response = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(response.isAcknowledged());
}
//添加文档
@Test
public void testAddDocument() throws IOException {
//创建对象
User user = new User("张三", 18);
//创建请求
IndexRequest request = new IndexRequest("java_test");
//规则 put /java_test/_doc/1
request.id("1");
request.timeout(TimeValue.timeValueSeconds(1));
//将数据放入请求 json
request.source(JSON.toJSONString(user), XContentType.JSON);
//客户端发送请求,获取响应结果
IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT);
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
//获取文档,判断是否存在
@Test
public void testExistDocument() throws IOException {
GetRequest request = new GetRequest("java_test","1");
//不获取返回的_source的上下文
request.fetchSourceContext(new FetchSourceContext(false));
request.storedFields("_none_");
boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
//获取文档的信息
@Test
public void testGetDocument() throws IOException {
GetRequest request = new GetRequest("java_test","1");
GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
String sourceAsString = response.getSourceAsString();
System.out.println(response);//返回全部内容和命令是一样的
System.out.println(sourceAsString);//打印文档内容
}
//更新文档的信息
@Test
public void testUpdateDocument() throws IOException {
UpdateRequest request = new UpdateRequest("java_test","1");
User user = new User("李四", 22);
request.doc(JSON.toJSONString(user),XContentType.JSON);
UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
System.out.println(response.status());
}
//删除文档记录
@Test
public void testDeleteDocument() throws IOException {
DeleteRequest request = new DeleteRequest("java_test", "1");
DeleteResponse deleteResponse = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());
}
//真实项目一般都会批量插入数据
@Test
public void testBulkRequest() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
List<User> userList = new ArrayList<>();
userList.add(new User("zhangan1", 18));
userList.add(new User("zhangan2", 18));
userList.add(new User("zhangan3", 18));
userList.add(new User("lisi1", 18));
userList.add(new User("lisi2", 18));
userList.add(new User("lisi3", 18));
//批处理请求
for (int i = 0; i < userList.size(); i++) {
//批量更新和批量删除,就在这里修改对应的请求就可以了
bulkRequest.add(
new IndexRequest("java_test")
.id("" + (i+1))
.source(JSON.toJSONString(userList.get(i)), XContentType.JSON)
);
}
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());//是否失败,返回false 代表成功
}
//查询
@Test
public void testSearch() throws IOException {
SearchRequest searchRequest = new SearchRequest("java_test");
//构建搜索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//查询条件,我们可以使用QueryBuilds工具类来实现
//QueryBuilders.termQuery() 精确
//QueryBuilders.matchAllQuery() 匹配所有
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "lisi1");
sourceBuilder.query(termQueryBuilder);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(searchResponse.getHits()));
System.out.println("===============================================");
for (SearchHit searchHit:searchResponse.getHits().getHits()) {
System.out.println(searchHit.getSourceAsString());
}
}
}