elasticsearch的基本概念和常用命令
elasticsearch的基本概念和常用命令
es的基本概念
倒排索引
倒排索引:es的底层排序是使用倒排索引的,通过value找到key(_id),es是有两个区,索引区和元数据区,元数据是存储完整的文档数据的,索引区记录每个字段的索引出现次数和长度,以便计算索引得分,用于返回排序的。es分别为每个字段都建立了一个倒排索引,因此查询字段term的时候,就能知道文档的id,就能快速找到对应的文档。
分词器
analysis:文本分析是吧全文本转换成一系列单词的过程,也叫做分词(analyzer)。analysis就是通过analyzer实现的。分词就是将文档通过analyzer分成一个个term,每个term都指向包含这个term的文档。
analyzer的组成:字符过滤器(character filter),分词器(tokenizers),token过滤器(token filter)
顺序:字符过滤器->分词器->token过滤器
ik分词器
ik_max_word:按最细粒度分词
ik_smart: 按最粗粒度分词
POST /_analyze
{
"analyzer": "ik_max_word",
"text": "中华人民共和国群众"
}
扩展词和停用词
扩展词:有些词并不是关键词,但是也希望被es用来作为检索的关键词,,可以将这些词加入到扩展词典
停用词:有些词是关键词,但是出于业务场景不想使用这些关键词被检索到,可以将这些词放入到停用词典
定义扩展词和停用词典可以修改IK分词器中config目录中IKAnalyzer.cfg.xml这个文件。
1. 修改文件 vim IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext_dict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">ext_stopwords.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
2. vim ext_dict.dic 在ik分词器中目录下config目录创建ext_dict.dic文件,编码一定要为utf-8才能生效,然后在里面加入扩展词即可,
3. vim ext_stopwords.dic 在ik分词器中目录下config目录创建ext_stopwords.dic文件,编码一定要为utf-8才能生效,然后再里面加入停用词即可
4. 重启es生效
Es 的基本操作
查看索引
GET _cat/indices?v
创建索引
PUT /orders
{
"settings": {
"number_of_shards": 1
, "number_of_replicas": 0
}
}
删除索引
DELETE /orders
创建索引,并创建相关映射
注意:索引的映射不能修改和删除,只能删除索引重新创建映射
PUT /products
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"id":{
"type": "long"
},
"name":{
"type": "keyword"
},
"price":{
"type": "double"
},
"create_time":{
"type": "date"
},
"description":{
"type": "text"
}
}
}
}
查看某个索引的映射
GET /products/_mapping
创建文档
注意:使用指定_id的方式,相同id增加,新的会覆盖旧的文档
#指定_id
POST /products/_doc/1
{
"id": 1,
"name": "小苹果",
"price": 5.66,
"create_time": "2022-06-13",
"description": "小苹果正好吃"
}
删除文档
基于_id删除
DELETE /products/_doc/1
更新文档
使用put方式,先删除后增加
PUT /products/_doc/1
{
“name”: “小苹果2”
}使用post方式,指定某个字段进行更新
POST /products/_doc/1/_update
{
“doc”:{"id": 1,
"name": "小苹果",
"price": 5.66,
"create_time": "2022-06-13",
"description": "小苹果正好吃"
}
}
查看文档
基于_id查询
GET /products/_doc/1
文档批量操作
批量操作不能格式化,并且批量操作并不是原子性的,一个报错并不会影响其他操作
POST /products/_doc/_bulk
{"index":{"_id":2}}
{"id":2,"name":"macbook","price":9999,"create_time":"2022-06-13","description":"macbook正好用"}
{"index":{"_id":3}}
{"id":3,"name":"phone","price":5999,"create_time":"2022-06-13","description":"phone"}
POST /products/_doc/_bulk
{"index":{"_id":4}}
{"id":4,"name":"猪猪","price":9999,"create_time":"2022-06-13","description":"猪猪真好吃呀"}
{"update":{"_id":3}}
{"doc":{"name":"phone13"}}
{"delete":{"_id":2}}
es的高级查询(QUERY-DSL)
查询索引的所有文档
GET /products/_search
{
"query":{
"match_all": {}
}
}
term查询指定字段
注意:
1、es中只有text类型是分词的,其他类型是不分词的
2、es中默认是使用标准分词器,对中文是按字分词,对英文是按单词分词的
GET /products/_search
{
"query": {
"term": {
"description": {
"value": "good"
}
}
}
}
range范围查询
range关键字:用来查询指定范围内的文档
GET /products/_search
{
"query": {
"range": {
"price": {
"gte": 0,
"lte": 1000
}
}
}
}
prefix前缀查询
GET /products/_search
{
"query": {
"prefix": {
"name": {
"value": "小"
}
}
}
}
wildcard通配符查询
wildcard:?用来匹配一个任意字符,*用来匹配多个任意字符
GET /products/_search
{
"query": {
"wildcard": {
"name": {
"value": "小*"
}
}
}
}
ids批量查询_id
GET /products/_search
{
"query": {
"ids": {
"values": [1,3]
}
}
}
fuzzy模糊查询
注意:fuzzy模糊查询最大模糊错误必须在0-2之间
- 搜索关键词长度为2不允许存在模糊
- 搜索关键词长度为3-5允许一次模糊
- 搜索关键词长度大于5允许最大两次模糊
GET /products/_search
{
"query": {
"fuzzy": {
"name": {
"value": "小果果"
}
}
}
}
bool布尔查询
must:相当于 && 同时成立
should: 相当于||成立一个即可
must_not: 相当于! 不能满足任何一个
GET /products/_search
{
"query": {
"bool": {
"must_not": [
{
"ids": {
"values": [1,3]
}
},
{
"term": {
"name": {
"value": "小狗"
}
}
}
]
}
}
}
Multi_match多字段查询
注意:字段类型如果分词,将查询条件分词之后再查询该字段
GET /products/_search
{
"query": {
"multi_match": {
"query": "好吃",
"fields": ["name","description"]
}
}
}
query_string 默认字段分词查询
GET /products/_search
{
"query": {
"query_string": {
"default_field": "description",
"query": "好吃"
}
}
}
highlight高亮查询
GET /products/_search
{
"query": {
"query_string": {
"default_field": "description",
"query": "好吃"
}
},
"highlight": {
"pre_tags": ["<span style='color:red;'>"],
"post_tags": ["</span>"],
"require_field_match": "false",
"fields": {
"*": {}
}
}
}
指定条数,分页查询,排序和返回指定字段
Size:默认返回10条
from:从第几条开始返回 规律:(当前页数-1)*size
sort:对指定字段排序
_source: 是一个数组,在数组中返回指定字段
GET /products/_search
{
"query": {
"match_all": {}
},
"from": 1,
"size": 2,
"sort": [
{
"price": {
"order": "desc"
}
}
],
"_source": ["name","price"]
}
es的过滤查询(Filter Query)
es的查询操作是分为两种:query和filter。
query:默认会计算每个文档的得分然后根据得分排序
filter:只会筛选出符合的文档,并不计算得分,而且可以缓存文档
所以,单从性能考虑,过滤是比查询更快的。过滤适合在大范围筛选数据,而查询适合精确匹配数据。一般应用时,应先使用过滤操作过滤数据,然后使用查询匹配数据。
注意:在执行query和filter时,先执行filter,再执行query
GET /products/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
],
"filter": [
{
"exists": {
"field": "name"
}
}
]
}
}
}
es的聚合查询
分组(terms)
GET /products/_search
{
"query": {
"match_all": {}
},
"aggs": {
"price_group":{
"terms": {
"field": "price",
"size": 10
}
}
}
}
最大值(max)
GET /products/_search
{
"query": {
"match_all": {}
},
"aggs": {
"price_max": {
"max": {
"field": "price"
}
}
}
}
es的集群搭建
注意:
- 所有节点集群名称必须一致:cluster.name
- 每个节点必有有唯一的名字:node.name
- 开启每个节点远程连接:network.host:0.0.0.0
- 指定使用IP地址进行集群节点通信:network.pulish_host;
- 修改web端口tcp端口 http.port:transport.tcp.port
- 指定集群中所有节点通信列表
- 允许集群初始化master节点数
- 集群中最少几个节点可用
- 开启每个节点跨域访问
还没有评论,来说两句吧...