添加映射与索引
# 创建索引
PUT person
# 查询索引
GET person
# 删除索引
DELETE person
# 查询映射
GET person/_mapping
# 添加映射 在添加映射之前必须有person索引
#即先进行
put person
#操作
PUT person/_mapping
{
"properties":{
"name":{
"type":"keyword"
},
"age":{
"type":"integer"
}
}
}
# 创建索引并添加映射
PUT person
{
"mappings": {
"properties": {
"name":{
"type": "keyword"
},
"age":{
"type":"integer"
}
}
}
}
# 索引库中添加字段
PUT person/_mapping
{
"properties":{
"address":{
"type":"text"
}
}
}
操作文档
# 查询索引
GET person
# 添加文档,指定id
PUT person/_doc/1
{
"name":"张三",
"age":20,
"address":"北京"
}
# 查询文档
GET person/_doc/1
# 添加文档,不指定id
POST person/_doc/
{
"name":"李四",
"age":20,
"address":"佛山"
}
# 查询文档
GET person/_doc/u8b2QHUBCR3n8iTZ8-Vk
# 添加文档,不指定id
POST person/_doc/
{
"name":"李四",
"age":20,
"address":"广州"
}
# 查询文档
GET person/_doc/u8b2QHUBCR3n8iTZ8-Vk
# 查询所有文档
GET person/_search
# 删除文档
DELETE person/_doc/1
# 修改文档 根据id,id存在就是修改,id不存在就是添加
PUT person/_doc/2
{
"name":"哈哈",
"age":20,
"address":"深圳"
}
全文查询-match查询
match和term的区别是,match查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询不会有分析器分析的过程
# match 先会对查询的字符串进行分词,在查询,求交集
GET person/_search
{
"query": {
"match": {
"address": "华为手机"
}
}
}
查询文档-term查询
term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇
请求url:
POST person/_search
请求体:
# 查询所有数据
GET person/_search
# 查询 深开头的数据
GET person/_search
{
"query": {
"term": {
"address": {
"value": "深"
}
}
}
}
查询全部
请求url:
GET person/_search
关键字搜索数据
请求url:
# 查询名字等于张三的用户
GET person/_search?q=name:张三
DSL 查询
DSL 查询主要包含两种类型的查询语句:
叶子查询语句 : 用于查询特殊字段的特殊值,例如:match, term, range 等。
复合查询语句 : 可以合并其他的叶子查询或复合查询,从而实现非常复杂的查询逻辑
根据年龄查询
POST shangguigu/_doc/_search
{
"query":{
"match":{
"age":20
}
}
}
查询年龄大于20岁的女性用户
GET shangguigu/_search
{
"query":{
"bool":{
"filter":{
"range":{
"age":{
"gt":20
}
}
},
"must":{
"match":{
"sex":"女"
}
}
}
}
}
全文搜索
GET shangguigu/_search
{
"query":{
"match":{
"name": "张三 李四"
}
}
}
高亮显示
GET shangguigu/_search
{
"query":{
"match":{
"name": "张三 李四"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
聚合
在Elasticsearch中,支持聚合操作,类似SQL中的group by操作。
GET shangguigu/_search
{
"aggs": {
"all_interests": {
"terms": {
"field": "age"
}
}
}
}
修改下查询语句
{
"aggs": {
"all_interests": {
"terms": {
"field": "age.keyword"
}
}
}
}
指定响应字段
在响应的数据中,如果我们不需要全部的字段,可以指定某些需要的字段进行返回
GET shangguigu/_doc/1001?_source=id,name
判断文档是否存在
如果我们只需要判断文档是否存在,而不是查询文档内容,那么可以这样:
HEAD shangguigu/_doc/1001
存在返回200 - OK
不存在返回404
批量操作:_bulk操作
批量插入数据:
POST _bulk
{"create":{"_index":"atguigu","_id":2001}}
{"id":2001,"name":"name1","age": 20,"sex": "男"}
{"create":{"_index":"atguigu","_id":2002}}
{"id":2002,"name":"name2","age": 20,"sex": "男"}
{"create":{"_index":"atguigu","_id":2003}}
{"id":2003,"name":"name3","age": 20,"sex": "男"}
批量删除:
POST _bulk
{"delete":{"_index":"atguigu","_id":2001}}
{"delete":{"_index":"atguigu","_id":2002}}
{"delete":{"_index":"atguigu","_id":2003}}
分页
和SQL使用 LIMIT 关键字返回只有一页的结果一样,Elasticsearch接受 from 和 size 参数:
size: 结果数,默认10
from: 跳过开始的结果数,默认0
GET shangguigu/_search?size=1&from=2
ElasticSearch集成IK分词器
1)下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
课程资料也提供了IK分词器的压缩包:
2)解压,将解压后的elasticsearch文件夹拷贝到elasticsearch-7.4.0\plugins下,并重命名文件夹为ik
3)重新启动ElasticSearch,即可加载IK分词器
IK分词器测试
IK提供了两个分词算法ik_smart 和 ik_max_word
其中 ik_smart 为最少切分,ik_max_word为最细粒度划分
最小切分:在浏览器地址栏输入地址
POST _analyze
{
"analyzer":"ik_smart",
"text":"我是小盆友"
}
最细切分:在浏览器地址栏输入地址
POST _analyze
{
"analyzer":"ik_max_word",
"text":"我是小盆友"
}
修改索引映射mapping
# 创建索引,添加映射,指定使用ik分词器
PUT person
{
"mappings": {
"properties": {
"name":{
"type": "keyword"
},
"address":{
"type":"text",
"analyzer": "ik_max_word"
}
}
}
}
# 查询索引
GET person
创建文档
# 添加文档
PUT person/_doc/1
{
"name":"张三",
"age":30,
"address": "华为5G手机"
}
# 添加文档
PUT person/_doc/2
{
"name":"李四",
"age":20,
"address": "小米手机2"
}
# 添加文档
PUT person/_doc/3
{
"name":"张三",
"age":29,
"address": "小米手机4"
}
# 查询所有数据
GET person/_search
再次测试term测试
# 使用term查询 深圳开头的数据
GET person/_search
{
"query": {
"term": {
"address": {
"value": "小米"
}
}
}
}