zoukankan      html  css  js  c++  java
  • (0.7)elasticsearch基本概念与基本原理

    什么是搜索引擎?

      常用的搜索网站:百度、谷歌

    【1】数据的分类

    结构化数据

      指具有固定格式或有限长度的数据,如数据库,元数据等。对于结构化数据,我们一般都是可以通过关系型数据库(mysql、oracle)的table的方法存储和搜索,也可以建立索引。通过b-tree等数据结构快速搜索数据

    非结构化数据

      全文数据,指不定长或无固定格式的数据,如邮件,word等。对于非结构化数据,也即对全文数据的搜索主要有两种方式:顺序扫描法,全文搜索法

    顺序扫描法

      我们可以了解它的大概搜索方式,就是按照顺序扫描的方式查找特定的关键字。比如让你在一篇篮球新闻中,找出“科比”这个名字在那些段落出现过。那你肯定需要从头到尾把文章阅读一遍,然后标出关键字在哪些地方出现过

      这种方式毋庸置疑是最低效的,如果文章很长,有几万字,等你阅读完这篇新闻找到“科比”这个关键字,那得花多少时间

    全文搜索

      对非结构化数据进行顺序扫描很慢,我们是否可以进行优化?把非结构化数据想办法弄得有一定结构不就好了嘛?将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对这些有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这种方式就构成了全文搜索的基本思路。这部分从非结构化数据提取出的然后重新组织的信息,就是索引。

    什么是全文搜索引擎#

      根据百度百科中的定义,全文搜索引擎是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每个词,对每个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户。

    【2】常见的搜索引擎

    Lucene#

    • Lucene是一个Java全文搜索引擎,完全用Java编写。lucene不是一个完整的应用程序,而是一个代码库和API,可以很容易地用于向应用程序添加搜索功能
    • 通过简单的API提供强大的功能
      • 可扩展的高性能索引
      • 强大,准确,高效的搜索算法
      • 跨平台解决方案
    • Apache软件基金会
      • 在Apache软件基金会提供的开源软件项目的Apache社区的支持
      • 但是Lucene只是一个框架,要充分利用它的功能,需要使用Java,并且在程序中集成Lucene。需要很多的学习了解,才能明白它是如何运行的,熟练运用Lucene确实非常复杂

    Solr#

    • Solr是一个基于Lucene的Java库构建的开源搜索平台。它以友好的方式提供Apache Lucene的搜索功能。它是一个成熟的产品,拥有强大而广泛的用户社区。它能提供分布式索引,复制,负载均衡以及自动故障转移和恢复。如果它被正确部署然后管理的好,他就能够成为一个高可用,可扩展且容错的搜索引擎
    • 强大功能
      • 全文搜索
      • 突出
      • 分面搜索
      • 实时索引
      • 动态集群
      • 数据库集成
      • NoSQL功能和丰富的文档处理

    ElasticSearch

    • ElasticSearch是一个开源,是一个机遇Apache Lucene库构建的Restful搜索引擎
    • ElasticSearch是Solr之后几年推出的。它提供了一个分布式,多租户能力的全文搜索引擎,具有HTTP Web页面和无架构JSON文档。ElasticSearch的官方客户端提供Java、Php、Ruby、Perl、Python、.Net和JavaScript
    • 主要功能
      • 分布式搜索
      • 数据分析
      • 分组和聚合
    • 应用场景
      • 维基百科
      • Stack Overflow
      • GitHub
      • 电商网站
      • 日志数据分析
      • 商品价格监控网站
      • BI系统
      • 站内搜索
      • 篮球论坛

    【3】ElasticSearch目录结构介绍

      

       

    目录结构说明,在配置文件里操作使用
    • home目录 :使用$ES_HOME表示,如上图,就是 /usr/local/elasticsearch
    • bin/ : 位置 $ES_HOME/bin,包含了elasticsearch和elasticsearch-plugin等脚本
    • conf/ :位置 $ES_HOME/config,包含了 配置文件 elasticsearch.yml 和 log4j2.properties,使用 path.conf 指定
    • data/ :位置 $ES_HOME/data,包含了每个index/shard的数据文件,可以指定多个位置,使用 path.data 指定
    • logs/ : 位置 $ES_HOME/logs,使用 path.logs 指定
    • plguins/ : 位置$ES_HOME/plugins
    • repo/ :使用 path.repo指定,没有默认位置,表示共享文件系统repository的位置。可以指定多个位置。
    • script/ :位置$ES_HOME/scripts,使用 path.scripts 指定。

    【4】ES的核心概念

    前言#

      传统数据库查询数据的操作步骤是这样的:建立数据库->建表->插入数据->查询

    NRT(Near Realtime)近实时

      

    默认是1秒批处理提交一次,非实时;

    如果检测到ES 最近没有查询,那么则可能会30秒批处理同步一次增删改操作

    索引(index)#

      一个索引可以理解成一个关系型数据库

    类型(type)#

      一个type就像一类表,比如user表、order表

      注意

        1、ES 5.X中一个index可以有多种type

        2、ES 6.X中一个index只能有一种type

        3、ES 7.X以后已经移除type这个概念

    映射(mapping)#

      mapping定义了每个字段的类型等信息。相当于关系型数据库中的表结构

    文档(document)#

      一个document相当于关系型数据库中的一行记录

    字段(field)#

      相当于关系型数据库表的字段

    集群(cluster)#

      集群由一个或多个节点组成,一个集群由一个默认名称“elasticsearch”

    节点(node)#

      集群的节点,一台机器或者一个进程

    分片和副本(shard)#

    • 副本是分片的副本。分片有主分片(primary Shard)和副本分片(replica Shard)之分
    • 一个Index数据在屋里上被分布在多个主分片中,每个主分片只存放部分数据
    • 每个主分片可以有多个副本,叫副本分片,是主分片的复制

    elasticsearch与数据库的类比

    关系型数据库(比如Mysql)非关系型数据库(Elasticsearch)
    数据库Database 索引Index
    表Table 类型Type
    数据行Row 文档Document
    数据列Column 字段Field
    约束 Schema 映射Mapping

    【5】RESTful风格的介绍

    介绍#

    •  RESTful是一种架构的规范与约束、原则,符合这种规范的架构就是RESTful架构
    • 先看REST是什么意思,英文Representational state transfer表述性状态转移,其实就是对资源的标书性状态转移,即通过HTTP动词来实现资源的状态扭转
    • 资源是REST系统的核心概念。所有的设计都是以资源为中心
    • elasticsearch使用RESTful风格api来设计的

    方法#

    action 描述
    HEAD 只获取某个资源的头部信息
    GET 获取资源
    POST 创建或更新资源
    PUT 创建或更新资源
    DELETE 删除资源
    GET /user:列出所有的⽤户
    POST /user:新建⼀个⽤户
    PUT /user:更新某个指定⽤户的信息
    DELETE /user/ID:删除指定⽤户

    调试工具:Postman工具(推荐)

      

     【6】什么是分词器#

    • 将用户输入的一段文本,按照一定逻辑,分析成多个词语的一种工具
    • example:The best 3-points shooter is Curry!

    常用的英文内置分词器#

    1. standard analyzer:除了数字、字母、下划线外,其他字符都是分隔符;
    2. simple analyzer:simple分析器当他遇到只要不是字母的字符,就将文本解析成term(搜索词项),而且所有的term都是小写的(即不是字符的就是分隔符)
    3. whitespace analyzer:空格为分隔符
    4. stop analyzer:与simple 一样,但 stopwords预定义的停止词列表,比如(ths,a,an,this,of,at)等等 ,即遇到这些词,会把他们同当成分隔符
    5. language analyzer:根据语言区分
    6. pattern analyzer:用正则表达式将文本分割成sterms,默认的正则表达式是W+

    常用中文分词器(需要额外装插件)

    smart

    IK

    如何测试?

    ip/_analyze

      

    三大数据类型#

    • 核心数据类型
    • 复杂数据类型
    • 专用数据类型

    【1/3】核心数据类型#

    字符串#

    • text:用于全文索引,该类型的字段将通过分词器进行分词
    • keyword:不分词,只能搜索该字段的完整的值

    数值型#

    • long、integer、short、byte、double、float、half_float、scaled_float

    布尔#

    • boolean

    二进制#

    • binary:该类型的字段把值当做经过base64编码的字符串,默认不存储,且不可搜索

    范围类型#

    1. 范围类型表示值是一个范围,而不是一个具体的值
    2. integer_range、float_range、long_range、double_range、date_range
    3. 比如age类型是integer_range,那么值可以是{"gte":20,"lte":40};搜索"term":{"age":21}可以搜索该值

    日期-date#

      由于json类型没有date类型,所以es通过识别字符串是否符合format定义的格式来判断是否为date类型

      format默认为:strict_date_optional_time || epoch_millis

      格式

        "2022-01-01" "2022/01/01 12:10:30" 这种字符串格式

      从开始纪元(1970年1月1日0点)开始的毫秒数

     
    PUT 192.168.199.170:9200/nba/_mapping
    
    {
        "properties": {
            "name": {
                "type": "text"
            },
            "team_name": {
                "type": "text"
            },
            "position": {
                "type": "text"
            },
            "play_year": {
                "type": "long"
            },
            "jerse_no": {
                "type": "keyword"
            },
            "title": {
                "type": "text"
            },
            "date": {
                "type": "date"
            }
        }
    }
     
     
    POST 192.168.199.170:9200/nba/_doc/4
    
    {
        "name": "蔡x坤",
        "team_name": "勇⼠",
        "position": "得分后卫",
        "play_year": 10,
        "jerse_no": "31",
        "title": "打球最帅的明星",
        "date": "2020-01-01"
    }
     
     
    POST 192.168.199.170:9200/nba/_doc/5
    
    {
        "name": "杨超越",
        "team_name": "猴急",
        "position": "得分后卫",
        "play_year": 10,
        "jerse_no": "32",
        "title": "打球最可爱的明星",
        "date": 1610350870
    }
     
     
    POST 192.168.199.170:9200/nba/_doc/6
    
    {
        "name": "吴亦凡",
        "team_name": "湖⼈",
        "position": "得分后卫",
        "play_year": 10,
        "jerse_no": "33",
        "title": "最会说唱的明星",
        "date": 1641886870000
    }
     

    【2/3】复杂数据类型#

    数据类型 Array#

    • ES中没有专门的数据类型,直接使用[]定义接口,数组中所有的值必须是同一种数据类型,不支持混合数据类型的数组
    • 字符串数组["one","two"]
    • 整数数组[1,2]
    • Object对象数组[{"name":"alex","age":18},{"name":"tom","age":18}]

    对象类型Object#

     
    POST 192.168.199.170:9200/nba/_doc/8
    
    {
        "name": "吴亦凡",
        "team_name": "湖⼈",
        "position": "得分后卫",
        "play_year": 10,
        "jerse_no": "33",
        "title": "最会说唱的明星",
        "date": "1641886870",
        "array": [
            "one",
            "two"
        ],
        "address": {
            "region": "China",
            "location": {
                "province": "GuangDong",
                "city": "GuangZhou"
            }
        }
    }
     

    索引方式

    "address.region": "China",
    "address.location.province": "GuangDong",
    "address.location.city": "GuangZhou"
     
    POST 192.168.199.170:9200/nba/_search
    
    {
        "query": {
            "match": {
                "address.region": "china"
            }
        }
    }
     

    【3/3】专用数据类型#

    IP类型#

      IP类型的字段用于存储IPv4和IPv6的地址,本质上是一个长整形字段

    POST 192.168.199.170:9200/nba/_mapping
    
    {
        "properties": {
            "name": {
                "type": "text"
            },
            "team_name": {
                "type": "text"
            },
            "position": {
                "type": "text"
            },
            "play_year": {
                "type": "long"
            },
            "jerse_no": {
                "type": "keyword"
            },
            "title": {
                "type": "text"
            },
            "date": {
                "type": "date"
            },
            "ip_addr": {
                "type": "ip"
            }
        }
    }
     
     
    PUT 192.168.199.170:9200/nba/_doc/9
    
    {
        "name": "吴亦凡",
        "team_name": "湖⼈",
        "position": "得分后卫",
        "play_year": 10,
        "jerse_no": "33",
        "title": "最会说唱的明星",
        "ip_addr": "192.168.1.1"
    }
     
     
    POST 192.168.199.170:9200/nba/_search
    
    {
        "query": {
            "term": {
                "ip_addr": "192.168.0.0/16"
            }
        }
    }

    【参考文档】

    本文概念转自,同增删查改基本使用也强烈推荐参考该文:https://www.cnblogs.com/chenyanbin/p/13419497.html

  • 相关阅读:
    一个帖子掌握android所有控件、ProgressBar 、Android 动画效果、SQLite、四大组件、Android多媒体(转
    Android开发交流群
    我的程序里 《我的歌声里》程序员版
    《老罗Android开发视频教程安卓巴士》(Android 开发)
    #百度360大战# 我为什么要支持360
    安卓巴士移动开发者周刊第九期
    水杯题的非常好的解释
    [LeetCode] Jump Game
    [LeetCode] Longest Common Prefix
    [CareerCup][Google Interview] 寻找动态的中位数
  • 原文地址:https://www.cnblogs.com/gered/p/14512699.html
Copyright © 2011-2022 走看看