elasticsearch 学习

本文介绍了如何使用Docker安装启动Elasticsearch和Kibana,并详细讲解了Elasticsearch的索引、映射、文档操作,包括创建、查询、删除等基本操作。此外,还涵盖了各种查询方式,如term、range、prefix、wildcard、fuzzy、bool等,并提到了分词器、过滤查询以及整合应用的实践。
摘要由CSDN通过智能技术生成

一、docker 安装启动 elasticsearch

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例

# 单节点启动
docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch -e "discovery.type=single-node" elasticsearch:7.17.0

image-20220207182536560

二、安装 kibana

注意版本的一致

Kibana 是一个针对Elasticsearch的开源分析及可视化平台,使用Kibana可以查询、查看并与存储在ES索引的数据进行交互操作,使用Kibana能执行高级的数据分析,并能以图表、表格和地图的形式查看数据。

docker run -d --name kibana -p 5601:5601 kibana:7.17.0

1、修改配置文件

推荐使用卷挂载技术(自行百度)

  • 进入容器内部目录(/usr/share/kibana/config)

  • 修改配置文件内容

2、访问测试

image-20220207183033030

三、书写测试

3.1、索引的基本操作

# 查询索引
GET _cat/indices?v

# 创建索引
PUT product

# 创建索引(进行索引分片配置)
PUT order
{
  "settings": {
     "number_of_shards": 1,  # 指定主分片的数量
    "number_of_replicas": 0  # 指定副分片的数量
  }
}

# 删除索引
DELETE product

3.2、映射的基本操作

# 创建索引指定映射 
# product(id,title,price,created_at,description)
PUT product
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "integer"
      },
      "title": {
        "type": "keyword"
      },
      "price": {
        "type": "double"
      },
      "created_at": {
        "type": "date"
      },
      "description": {
        "type": "text"
      }
    }
  }
}

# 查看索引的映射
GET product/_mapping

3.3、文档的基本操作

# 添加文档(指定_id,不指定则自动生成)
POST product/_doc/1
{
  "id": 1,
  "title": "花生米",
  "price": 3.5,
  "created_at": "2022-02-08",
  "description": "花生米嘎嘣脆!!!"
}

# 添加文档(不指定_id,不指定则自动生成)  00Jv134B_6B7V4VLtPBo
POST product/_doc
{
  "title": "火腿肠",
  "price": 2,
  "created_at": "2022-02-06",
  "description": "火腿肠腿很长!!!"
}


# 查看文档(基于_id查看)
GET product/_doc/1
GET product/_doc/00Jv134B_6B7V4VLtPBo


# 删除文档(基于_id删除)
DELETE product/_doc/00Jv134B_6B7V4VLtPBo

# 修改文档(这种方式会删除原始文档,重新插入)
PUT product/_doc/1
{
  "id": 1,
  "title": "大大花生米",
  "price": 3.5,
  "created_at": "2022-02-08",
  "description": "花生米嘎嘣脆!!!"
}
# 修改文档(直接修改操作)
POST product/_doc/1/_update
{
  "doc": {
    "title": "普通花生米"
  }
}

3.4、批量操作

# 批量添加两条文档
POST /product/_doc/_bulk
{"index":{"_id":2}}
{"id":2,"title":"葵花","price":2.5,"created_at":"2022-02-08","description":"葵花笑哈哈!!!"}
{"index":{"_id":3}}
{"id":3,"title":"辣条","price":1.5,"created_at":"2022-02-08","description":"辣条美滋滋!!!"}

# 查看
GET product/_doc/2
GET product/_doc/3

# 更新文档同时删除文档
POST /product/_doc/_bulk
{"update":{"_id":2}}
{"doc":{"title":"超大葵花"}}
{"delete":{"_id":3}}

四、常见查询

4.1、关键字查询 [term]

term 关键字:用来使用关键字查询

# 查询所有
GET /product/_search
{
  "query": {
    "match_all": {}
  }
}

# 关键字查询(term)
GET /product/_search
{
  "query": {
    "term": {
      "title": {
        "value": "普通花生米"
      }
    }
  }
}

GET /product/_search
{
  "query": {
    "term": {
      "description": {
        "value": "嘎"
      }
    }
  }
}

NOTE1: 通过使用 term 查询得知 ES 中默认使用分词器为 标准分词器(StandardAnalyzer),

标准分词器对于英文单词分词,对于中文单字分词。

NOTE2: 通过使用 term 查询得知,在ES的Mapping Type 中 keyword , date, integer, long , double , boolean or ip 这些类型不分词,

只有text类型分词

4.2、范围查询 [range]

range 关键字:用来指定查询指定范围内的文档

GET /product/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 1,
        "lte": 2
      }
    }
  }
}

4.3、前缀查询 [prefix]

prefix 关键字:用来检索含有指定前缀的关键词的相关文档

GET /product/_search
{
  "query": {
    "prefix": {
      "title": {
        "value": "普通"
      }
    }
  }
}

4.4、通配符查询 [wildcard]

wildcard 关键字: 通配符查询

? 用来匹配一个任意字符

* 用来匹配多个字符

GET /product/_search
{
  "query": {
    "wildcard": {
      "title": {
        "value": "*花生*"
      }
    }
  }
}

4.5、多id查询 [ids]

ids 关键字: 值为数组类型,用来根据一组id获取多个对应的文档

GET /product/_search
{
  "query": {
    "ids": {
      "values": [1,2,4]
    }
  }
}

4.6、模糊查询 [fuzzy]

fuzzy 关键字:用来模糊查询含有指定关键字的文档

GET /product/_search
{
  "query": {
    "fuzzy": {
      "title": "超大葵葵"
    }
  }
}

注意: fuzzy 模糊查询 最大模糊错误必须在0-2之间

  • 搜索关键词长度为2不允许存在模糊
  • 搜索关键词长度为3-5允许一次模糊
  • 搜索关键词长度大于5允许最大2模糊

4.7、布尔查询 [bool]

bool 关键字:用来组合多个条件实现复杂查询

**must:**相当于&& 同时成立

**should:**相当于|| 成立一个就行

**must_not:**相当于! 不能满足任何一个

# must (同时成立)
GET /product/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "title": {
            "value": "超大葵花"
          }
        }},
        {
          "ids": {"values": [2]}
        }
      ]
    }
  }
}

# should (满足一个就成立)
GET /product/_search
{
  "query": {
    "bool": {
      "should": [
        {"term": {
          "title": {
            "value": "超大葵花"
          }
        }},
        {
          "ids": {"values": [1]}
        }
      ]
    }
  }
}

# must_not (取反,不满足则成立)
GET /product/_search
{
  "query": {
    "bool": {
      "must_not": [
        {"term": {
          "title": {
            "value": "超大葵花"
          }
        }}
      ]
    }
  }
}

4.8、多字段查询 [multi_match]

GET product/_search
{
  "query": {
    "multi_match": {
      "query": "花",
      "fields": ["title","description"]
    }
  }
}

4.9、默认字段分词查询 [query_string]

GET product/_search
{
  "query": {
    "query_string": {
      "default_field": "description",
      "query": "花和腿"
    }
  }
}

五、其他查询

5.1、高亮查询 [highlight]

**highlight 高亮查询:**可以让符合条件的文档的关键词高亮

GET product/_search
{
  "query": {
    "query_string": {
      "default_field": "description",
      "query": "花和腿"
    }
  }, 
  "highlight": {
    "pre_tags": ["<span style='color:red;'>"], 
    "post_tags": ["<span>"],
    "require_field_match": "false", 
    "fields": {
      "*": {}
    }
  }
}

5.2、返回指定条数 [size]

**size关键字:**指定查询结果中返回指定条数。 默认返回10条

GET /product/_search
{
  "query": {
    "match_all": {}
  },
  "size": 2
}

5.3、分页查询 [form]

from关键字:用来指定起始的返回位置,和size关键字连用实现分页的效果

GET /product/_search
{
  "query": {
    "match_all": {}
  },
  "from": 1, 
  "size": 2
}

5.4、指定字段排序 [sort]

GET /product/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

5.6、返回指定字段 [_source]

**_source 关键字:**是一个数组,在数组中用来指定展示哪些字段

GET /product/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["title","price"]
}

六、分词器

内置分词器

  • Standard Analyzer -默认分词器,英文按单词词切分,并小写处理
  • Simple Analyzer -按照单词切分(符号被过滤),小写处理
  • Stop Analyzer-小写处理,停用词过滤(the,a,is)
  • Whitespace Analyzer-按照空格切分,不转小写
  • Keyword Analyzer-不分词,直接将输入当作输出

中文分词器

在ES中支持中文分词器非常多如smartCN、IK等,推荐的就是 IK分词器

1、官网下载

https://github.com/medcl/elasticsearch-analysis-ik/releases

2、解压文件

image-20220210155728085

3、移动

把文件夹移动到 es 容器的 plugins 文件夹目录下(推荐使用卷挂载技术)

sudo docker cp /mnt/e/develop/application/ik-7.17.0 95752ce86ff4:/usr/share/elasticsearch/plugins/

4、重启容器,进行测试

# 测试分词器(粗粒度)
POST /_analyze
{
  "analyzer": "ik_smart",
  "text": "中华人民共和国国歌"
}

image-20220210160924262

# 测试分词器(细粒度)
POST /_analyze
{
  "analyzer": "ik_max_word",
  "text": "中华人民共和国国歌"
}

image-20220210161042586

扩展词、停用词配置

lK支持自定义扩展词典停用词典

  • 扩展词典就是有些词并不是关键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入扩展词典。
  • 停用词典就是有些词是关键词,但是出于业务场景不想使用这些关键词被检索到,可以将这些词放入停用词典。

定义扩展词典和停用词典可以修改IK分词器中 config 目录中 IKAnalyzer.cfg.xml 这个文件。

默认推荐使用的配置:

image-20220210162845091

修改完成后,重启容器即可!

七、过滤查询

过滤适合在大范围筛选数据,而查询则适合精确匹配数据。一般应用时,应先使用过滤操作过滤数据,然后使用查询匹配数据。

必须和bool 配合使用

image-20220210163357529

GET /product/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "description": {
              "value": "花"
            }
          }
        }
      ],
      "filter": [
        {
          "term": {
            "description": "哈"
          }
        }
      ]
    }
  }
}

八、整合应用

观看:https://www.bilibili.com/video/BV1SQ4y1m7Ds

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Main12138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值