ES基础操作

一、常用操作
(1)索引库操作
1、查询es中的所有索引库

GET /_cat/indices?v

2、创建索引库(并指定ik分词器)

PUT /es_db
{
  "settings": {
        "index":{
          "analysis.analyzer.default.type":"ik_max_word"
        }
  }
}

需下载ik分词器:Releases · medcl/elasticsearch-analysis-ik · GitHub

并解压到plugins/ik文件夹下

一般创建索引库使用如下配置:

PUT /es_db
{
  "settings": {
        "index":{
          "analysis.analyzer.default.type":"ik_max_word"
        }
  },
  "mappings":{
      "properties":{
          "id":{"type":"keyword","index":true,"store":true},
          "title":{"type":"text","index":true,"store":true},
          "content":{"type":"text","index":true,"store":true}
      }
  }
}

3、查询索引库

GET /es_db

4、删除索引库

DELETE /es_db

(2)文档操作
1、添加或修改文档(根据有无id判断)

PUT /es_db/_doc/1
{
 "name":"sumengnan",
 "desc":"我爱你中国",
 "age":25
}
PUT /es_db/_doc/2
{
 "name":"张三",
 "desc":"中华人民共和国",
 "age":20
}

2、查询文档

GET /es_db/_doc/1

3、删除文档

DELETE /es_db/_doc/1

二、基础查询操作

1、查询当前类型中所有的文档
GET /es_db/_doc/_search

2、条件查询,如查询age等于20的数据
GET /es_db/_doc/_search?q=age:20

3、小于等于条件查询,例如查询年龄小于23岁的
GET /es_db/_doc/_search?q=age:<=23

4、小于大于条件查询,例如查询年龄大于23岁的
GET /es_db/_doc/_search?q=age:>23

5、范围查询,查询age在2022之间的数据
GET /es_db/_doc/_search?q=age[20 TO 22]

6、批量id查询,例如根据多个id查询数据
GET /es_db/_doc/_mget
{
  "ids":[1,2]
}

7、分页查询 from=*&size=*
GET /es_db/_doc/_search?q=age:20&from=0&size=2

8、对结果只输出某些字段
GET /es_db/_doc/_search?_source=name,desc

9、对结果进行排序
GET /es_db/_doc/_search?sort=age:desc

三、DSL高级查询(精髓)
(1)query方式查询
说明:在es中存储的数据都会存在一个_score分值,分值越高越匹配。计算分值复杂需要一定时间

1、term不分词
GET /es_db/_doc/_search
{
  "query":{
      "term": {
         "name":"张三"
      }
    }
  }
}

2、match分词
GET /es_db/_doc/_search
{
  "query":{
      "match": {
         "desc":"中国"
      }
    }
  }
}
#match或分词:
GET /es_db/_search
{
  "query":{
      "match": {
         "desc":{
            "query":"人民 中国",
            "operator":"or"
         }
      }
    }
  }
}

3、multi_match多字段模糊匹配查询
GET /es_db/_doc/_search
{
  "query":{
      "multi_match":{
         "query":"张三",
         "fields":["name","desc"]
      }
    }
  }
}

4、query_string未指定字段查询(AND或OR大写)
GET /es_db/_doc/_search
{
  "query":{
      "query_string":{
        "query":"张三 OR 我爱你"
      }
    }
  }
}
5、query_string指定字段查询(AND或OR大写)
GET /es_db/_doc/_search
{
  "query":{
      "query_string":{
        "query":"张三 OR 我爱你",
        "fields":["name","desc"]
      }
    }
  }
}


6、range范围查询
说明:gte:大于等于,lte:小于等于,gt:大于,lt:小于,now:当前时间
GET /es_db/_doc/_search
{
  "query":{
      "range":{
         "age":{
            "gte":23,
            "lte":25
         }
      }
    }
  }
}

7、from,size分页、_source输出字段、sort排序等查询
GET /es_db/_doc/_search
{
  "from":0,
  "size":2,
  "_source":["name","desc"],
  "sort":{
    "age":"desc"
  },
  "query":{
      "match": {
         "desc":"中国"
      }
    }
  }
}

8、前缀匹配
GET /es_db/_search
{
  "query":{
      "prefix": {
        "desc.keyword": {
          "value": "我爱"
        }
      }
    }
  }
}2)filter方式查询
说明:不会计算相关分值,也不会对结果进行排序,效率高。查询的结果可以被缓存。
GET /es_db/_doc/_search
{
  "query":{
     "bool":{
        "filter":{
           "term":{
             "name":"张三"
           }
        }
     }
    }
  }
}3)bool查询
GET /es_db/_doc/_search
{
  "query":{
    "bool":{
      "must": [
        {"match": {
           "gender": "男"
        }},
        {"match":{
          "address": "中国"
        }}
      ],
      "must_not": [
        {"match":{
          "age": "18"
        }}
      ],
      "should":[
        {"match":{
          "lastname": "张"
        }}
      ]
    }
  }
}

性别是男,地址是中国,年龄不能是18,最好姓张(不是也没事,影响分值而已)

(4)通配符查询
GET /es_db/_doc/_search
{
  "query": {
      "bool": {
          "must": [
              {"wildcard": {"title": "*网*"}}
          ]
      }
  }
}

四、mapping映射有关
1、获取索引库映射信息

GET /es_db/_mapping

2、创建索引库并指定静态映射
说明:keyword不会分词(能聚合、排序),text会分词(不能聚合、排序),index建立索引,store是否存储(不存储查不到,一般只需搜索而不需展示到页面的才设置false,如地址)

PUT /es_db
{
  "mappings":{
      "properties":{
          "name":{"type":"keyword","index":true,"store":true},
          "desc":{"type":"text","index":true,"store":true},
          "age":{"type":"integer","index":true,"store":true}
      }
  }
}

附:映射字段数据类型:

1、简单数据类型:

字符型:text
数字型:long,integer,shrot,byte,double,float
日期类型:date
布尔类型:boolean
二进制:binary
2、复杂数据类型:

数组类型:不需要专门的类型来定义数组
对象数据类型:object,单独的json对象
嵌套数据类型:nested,关于json对象的数组
3、地理数据类型:

地理点数据类型:geo_point,经纬度点
地理形状数据类型:geo_shape,多边形的复杂地理形状
4、专门数据类型:

ipv4数据类型:ip协议为ipv4的地址。
完成数据类型:completion,提供自动补全的建议
单词计数数据类型:token_count,统计字符串中单词的数量
不被分词数据类型:keyword
3、静态映射同时指定分词器(一般不用这个,指定全局的就好了)

PUT /es_db
{
  "mappings":{
      "properties":{
          "name":{"type":"keyword","index":true,"store":true,"analyzer": "ik_smart","search_analyzer": "ik_max_word"},
          "desc":{"type":"text","index":true,"store":true,"analyzer": "ik_smart","search_analyzer": "ik_max_word"},
          "age":{"type":"integer","index":true,"store":true,"analyzer": "ik_smart","search_analyzer": "ik_max_word"}
      }
  }
}

五、整合springboot
(1)添加依赖

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>

(2)注入RestHighLevelClient

 @Autowired
    private RestHighLevelClient restHighLevelClient;

(3)插入数据

   //模拟json数据
    HashMap<Object, Object> map = new HashMap<>();
    map.put("username","sumengnan");
    map.put("password","123456");

  //创建一个批量写入请求
    BulkRequest bulkRequest = new BulkRequest();
    //索引库请求
    IndexRequest indexRequest = new IndexRequest("user","_doc");
    indexRequest.source(JSON.toJSONString(map),XContentType.JSON);
    bulkRequest.add(indexRequest);
    try {
        //bulk是批量写入
        //mget是批量读取
        BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulk.buildFailureMessage());
        if (!bulk.hasFailures()) {**加粗样式**
            System.out.println("ok");
        }else{
            System.out.println("no ok");在这里插入代码片
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

(4)查询数据

//构建搜索请求
    SearchRequest searchRequest = new SearchRequest("user");
 
    //构建搜索源
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.from(1);
    searchSourceBuilder.size(4);
    //设置查询
    MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("username", "sumengnan");
    searchSourceBuilder.query(matchQueryBuilder);
    //设置高亮
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    highlightBuilder.field("username");
    highlightBuilder.preTags("<span style='color:red'>");//设置前缀标签
    highlightBuilder.postTags("<span>");//设置后缀标签
    searchSourceBuilder.highlighter(highlightBuilder);
 
    searchRequest.source(searchSourceBuilder);//搜索源加入搜索请求
 
    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    for (SearchHit hit : searchResponse.getHits()) {
        Map<String, Object> sourceAsMap = hit.getSourceAsMap();
        System.out.println(sourceAsMap);
        Map<String, HighlightField> highlightFields = hit.getHighlightFields();
        HighlightField username = highlightFields.get("username");
        Text[] fragments = username.getFragments();
        for (Text fragment : fragments) {
            return fragment.string();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值