zoukankan      html  css  js  c++  java
  • ElasticSearch 学习 一

    ElasticSearch

    倒排索引:将文档进行分词,形成词条和id的对应关系即为反向索引

    1、ElasticSearch存储和查询的原理

    ElasticSearch是一个基于Lucene的搜索服务器

      是一个分布式、高扩展、高实时的搜索与数据分析引擎

      基于RESTful web接口

     应用场景:

      搜索:海量数据的查询

      日志数据分析

      实时数据分析

    数据库查询存在问题:

      1.性能低:使用模糊查询,会使索引失效,进行全表扫描,性能低

      2.功能弱:当使用string做为查询的条件,可能查询不出来数据

    ElasticSearch使用倒排索引,对数据库中的字段进行分词,可以快速查询到数据

    索引(index)

    ElasticSearch存储数据的地方,可以理解成关系型数据库中的数据库概念。成为索引库

    映射(mapping)

    mapping定义了每个字段的类型、字段所使用的分词器等。相当于关系型数据库中的表结构。

    文档(document)

    Elasticsearch中的最小数据单元,常以json格式显示。一个document相当于关系型数据库中的一行数据。

    倒排索引

    一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,对应一个包含它的文档id列表。

    类型(type)

    一种type就像一类表。如用户表、角色表等。在Elasticsearch7.X默认type为_doc

    RESTful风格介绍

      REST(Representational State Transfer)表述性状态转移 ,是一组架构约束性条件和原则,满足这些原则和条件的应用程序或设计就是RESTful风格

      是基于HTTP协议,使用XML格式定义或者JSON格式定义,每个url代表一种资源,客户端使用GET、POST、PUT、DELETE 4个表示操作方式的动词对服务端资源进行操作

      GET:用来获取资源

      POST:用来新建资源(也可以用于更新资源)

      PUT:用来更新资源

      DELETE:用来删除资源

    2、操作索引

    利用postman进行索引的操作

    添加索引(put)    http://ip:端口/索引名称 

    查询索引(get)

      http://ip:端口/索引名称 # 查询单个索引信息

      http://ip:端口/索引名称1,索引名称2... # 查询多个索引信息

      http://ip:端口/_all # 查询所有索引信息

    关闭、打开索引(post)

      http://ip:端口/索引名称/_close

      http://ip:端口/索引名称/_open

    删除索引(delete)

      http://ip:端口/索引名称

    数据类型:

      字符串:

        text:会分词,不支持聚合

        keyword:不会分词,将全部内容作为一个词条,支持聚合

    操作映射

    • 添加映射
      •  1 #添加映射
         2  PUT /person/_mapping
         3  {
         4    "properties":{
         5      "name":{
         6        "type":"text"
         7      },
         8      "age":{
         9        "type":"integer"
        10      }
        11    }
        12  }
    • 创建索引并添加映射
      •  #创建索引并添加映射
         PUT /person1
        {
          "mappings": {
            "properties": {
              "name": {
                "type": "text"
              },
              "age": {
                "type": "integer"
              }
            }
          }
        }
    • 添加字段
      •  1 #添加字段
         2 PUT /person1/_mapping
         3 {
         4   "properties": {
         5       "name": {
         6         "type": "text"
         7       },
         8       "age": {
         9         "type": "integer"
        10       }
        11     }
        12 }
            

    操作文档

    • 添加文档,指定id
      • 1 POST /person1/_doc/2
        2 {
        3   "name":"张三",
        4   "age":18,
        5   "address":"北京"
        6 }
        7 
        8 GET /person1/_doc/1
    • 添加文档不指定id
      •  1 #添加文档,不指定id
         2 POST /person1/_doc/
         3 {
         4   "name":"张三",
         5   "age":18,
         6   "address":"北京"
         7 }
         8 
         9 #查询所有文档
        10 GET /person1/_search
    • 删除指定文档id
      • #删除指定id文档 DELETE /person1/_doc/1

    3、分词器

    分词器:IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包

    IK分词器有两种分词模式:

    ik_max_word  会将文本进行最细粒度的拆分  

    例如 乒乓球 分为 乒、乓、球和乒乓球 

    ik_smart 会做最粗粒度的拆分

    例如 乒乓球牛皮    拆分为 乒乓球 、牛皮

    IK分词器查询文档

    词条查询 term

      词条查询不会分析查询条件,只有当词条和查询字符串完全匹配时,才匹配搜索

    全文查询: match

      全文查询会分析查询条件,先将查询条件进行分词,然后查询,求并集

    • 创建索引,添加映射,并制定分词器为ik分词器
      •  1 PUT person2
         2 {
         3   "mappings": {
         4     "properties": {
         5       "name": {
         6         "type": "keyword"
         7       },
         8       "address": {
         9         "type": "text",
        10         "analyzer": "ik_max_word"
        11       }
        12     }
        13   }
        14 }
    • 添加文档
      •  1 POST /person2/_doc/1
         2 {
         3   "name":"张三",
         4   "age":18,
         5   "address":"北京海淀区"
         6 }
         7 
         8 POST /person2/_doc/2
         9 {
        10   "name":"李四",
        11   "age":18,
        12   "address":"北京朝阳区"
        13 }
        14 
        15 POST /person2/_doc/3
        16 {
        17   "name":"王五",
        18   "age":18,
        19   "address":"北京昌平区"
        20 }
          
    • 查询分词效果
      •  1 GET _analyze 2 { 3 "analyzer": "ik_max_word", 4 "text": "北京海淀" 5 }   
    • 词条查询: term
      •  1 GET /person2/_search
         2 {
         3   "query": {
         4     "term": {
         5       "address": {
         6         "value": "北京"
         7       }
         8     }
         9   }
        10 }
    • 全文查询: match    全文查询会分析查询条件,先将查询条件进行分词,然后查询,求并集
      • 1 GET /person2/_search
        2 {
        3   "query": {
        4     "match": {
        5       "address":"北京昌平"
        6     }
        7   }
        8 }
          
  • 相关阅读:
    接口请求的例子
    SQLServer跨库查询分布式查询
    查看数据库估计的执行计划
    数据库对比工具
    十步完成windows服务的安装
    cdn 浏览器缓存机制
    quartz spring 整合例子
    利用jquery 实现多文件上传
    监测数据库的结构变化
    yii sql的输出
  • 原文地址:https://www.cnblogs.com/luckysupermarket/p/13843339.html
Copyright © 2011-2022 走看看