ElasticSearch入门学习
一、下载安装ElaticSearch
1、ElaticSearch下载地址
https://www.elastic.co/cn/downloads/elasticsearch
2、windows版本的安装方法
解压即用,解压后目录结构如下:
3、启动ElasticSearch
进入bin目录,点击elasticsearch.bat文件
4、解决跨域访问问题
进入config文件夹下,打开elaticsearch.yml文件,增加以下两项配置。
二、下载安装ElasticSearch-head可视化插件
1、下载安装elaticsearch-head
下载地址:https://github.com/mobz/elasticsearch-head
2、进入可视化界面
地址: http://localhost:9100/
登录后连接elasticsearch:http://localhost:9200/
三、下载安装kibana
1、下载安装
下载地址:https://www.elastic.co/cn/downloads/kibana
解压即可用,在bin目录下点击kibana.bat启动
2、进入可视化界面
地址:http://localhost:5601
四、IK分词器插件
1、安装IK分词器
下载地址: https://github.com/medcl/elasticsearch-analysis-ik
下载好之后解压放到elasticsearch目录下的plugins文件夹下。如下图:
2、使用IK分词器
IK提供了两个分词算法:ik_smart和ik_max_word,其中ik_smart为最少切分,ik_max_word为最细粒度划分!
对 “小狗狗叫麦兜” 进行拆分
ik_smart拆分结果如下:
ik_max_word拆分结果如下:
3、创建自己的分词字典
想要在拆分时,把“麦兜”两个字合成一个词。怎么做?
第一步:进入ik分词器插件目录的config文件夹下,新增字典“mydic.txt",并在字典中增加”麦兜“。
第二步:打开IKAnalyzer.cfg文件,将字典名称加入到配置文件中,如下图:
第三步:重启elasticsearch
第四步:查看分词效果
ik_smart算法分词效果
ik_max_word算法分词效果
五、Restful基础测试
1、创建一个索引
PUT /索引名/类型名/文档id
{请求体}
用kibana操作:
用elasticsearch-head查看:
elasticsearch索引数据类型有哪些?
字符串类型
text、keyword
数值类型
long,integer,short,byte,double,float,half float,scaled float
日期类型
date
布尔类型
boolean
二进制类型
binary
等等
单存的创建一个索引,并指定字段类型
可以通过GET请求获取索引的具体信息:
如果文档字段没有指定类型,es会默认给每个字段设置类型
2、删除索引
删除索引: DELETE 索引名称
删除索引下的单个文档: DELETE /索引名称/类型名称/id
六、文档操作
1、添加数据 PUT
PUT /renyao/user/2
{
"name": "张三",
"age": 18,
"desc": "法外狂徒",
"tags":["旅游","赌博","帅气"]
}
2、获取数据 GET
GET /renyao/user/1
3、更新数据 PUT或POST
put来修改整条数据,如下图:
POST /xxx/xxx/xxx/_update可以修改某个文档的单个字段,
4、查询数据 GET search
(1)单个条件查询
GET /索引/类型/_search?q=key:value,如下所示, value值是模糊查询
查询结果中有个score值,这个是匹配度,值越大匹配度越高。
GET /renyao/user/_search
{
"query" :{
"match": {
"name": "刘"
}
}
}
(2)查询结果过滤字段
GET /renyao/user/_search
{
"query" :{
"match": {
"name": "刘"
}
}
}
(3)查询结果排序
GET /renyao/user/_search
{
"query" :{
"match": {
"name": "刘"
}
},
"_source": ["name","age"],
"sort":[
{
"age" : {
"order": "asc"
}
}
]
}
(4)查询结果限制条数
GET /renyao/user/_search
{
"query" :{
"match": {
"name": "刘"
}
},
"_source": ["name","age"],
"sort":[
{
"age" : {
"order": "asc"
}
}
],
"from":2, //从查询结果的第2条开始
"size": 2 //限制只要2条数据,即查询结果的第3到第4条数据
}
(5)多条件查询
must相当于(and)
should相当于(or)
must_not相当于(not)
GET /renyao/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "刘"
}
},
{
"match": {
"age": 16
}
}
]
}
}
}
(6)查询过滤
GET /renyao/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "刘"
}
}
],
"filter": {
"range": {
"age": {
"gt": 20
}
}
}
}
}
}
gt大于,lt小于,gte大于等于,lte小于等于。
(7)精确查询
- term,精确查询
- match,模糊查询,会使用分词解析器!
text数据类型会被分词器解析,keyword类型不会被分词器解析。
创建一个索引:
PUT /kuangshen
{
"mappings": {
"properties": {
"name": {
"type": "text" //text类型字段
},
"desc": {
"type": "keyword" //keyword类型字段
}
}
}
}
插入两条数据:
term查询name字段(text类型)
term查询desc字段(keyword类型)
多个值精确匹配
(8)高亮查询
GET kuangshen/_search
{
"query":{
"match": {
"name": "麦兜"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
可以自定义高亮标签:
GET kuangshen/_search
{
"query":{
"match": {
"name": "麦兜"
}
},
"highlight": {
"pre_tags": "<p class='key' style = 'color:red'", //高亮标签前缀
"post_tags": "</p>", //高亮标签后缀
"fields": {
"name": {}
}
}
}
七、springboot与elasticsearch结合
官网查找javaAPI
依赖:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.12.1</version>
</dependency>
整合springboot步骤:
1、创建配置类
@Configuration
public class ElasticSearchClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient() {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http")));
return client;
}
}
2、测试API
(1)创建索引
@SpringBootTest
class ElasticsearchApplicationTests {
@Autowired
private RestHighLevelClient restHighLevelClient;
@Test
void testAPI() throws IOException {
//1、创建索引请求 Request
CreateIndexRequest kuang_index = new CreateIndexRequest("kuang_index");
//2、执行创建请求
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(kuang_index, RequestOptions.DEFAULT);
}
}
(2)获取索引
@Test
void testGetIndex() throws IOException {
GetIndexRequest kuang_index = new GetIndexRequest("kuang_index");
boolean exists = restHighLevelClient.indices().exists(kuang_index, RequestOptions.DEFAULT);
System.out.println(exists);
}
(3)删除索引
@Test
void testDeleteIndex() throws IOException {
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("kuang_index");
AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
}
(4)添加文档
@Test
void testAddDoc() throws IOException {
User user = new User("javaTest1",3);
//创建请求
IndexRequest indexRequest = new IndexRequest("kuang_index");
//规则 put /indexRequest/_doc/1
indexRequest.id("1");
indexRequest.timeout(TimeValue.timeValueSeconds(1));
indexRequest.timeout("1s");
//放入数据
indexRequest.source(JSON.toJSONString(user), XContentType.JSON);
//客户端发送请求
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
(5)判断索引中某个文档是否存在
@Test
void testIsExistDoc() throws IOException {
GetRequest getRequest = new GetRequest("kuang_index", "1");
// 不获取返回的 _source 的上下文
getRequest.fetchSourceContext(new FetchSourceContext(false));
getRequest.storedFields("_none_");
boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
(6)获取索引中某个文档的内容
@Test
void testGetDoc() throws IOException {
GetRequest getRequest = new GetRequest("kuang_index", "1");
GetResponse documentFields = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
System.out.println(documentFields.getSourceAsString());
System.out.println(documentFields);//返回的内容和命令返回一样
}
(7)更新索引中的某个文档的内容
@Test
void testUpdateDoc() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("kuang_index","1");
updateRequest.timeout("1s");
User user = new User("狂神说java",23);
updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse.status());
}
(8)删除索引中的某个文档
@Test
void testDeleteDoc() throws IOException {
DeleteRequest request = new DeleteRequest("kuang_index","2");
request.timeout("1s");
DeleteResponse deleteResponse = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());
}
(9)查询索引中的文档
@Test
void testSearch() throws IOException {
SearchRequest searchRequest = new SearchRequest("kuang_index");
//构建查询条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name","java");
//MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "java");
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()));
for (SearchHit hit : searchResponse.getHits().getHits()) {
System.out.println(hit.getSourceAsMap());
}
}