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节点数
  • 集群中最少几个节点可用
  • 开启每个节点跨域访问

猜你喜欢

转载自blog.csdn.net/qq798867485/article/details/129999563