zoukankan      html  css  js  c++  java
  • Elasticsearch初识及简单操作

    Lucene

    是Apache软件基金会4 jakarta项目的子项目。它是一个开源的全文检索引擎工具包。但它并不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)

    相当于一个库, 还有很多东西要自己写.

    ElasticSearch

    权威指南: https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

    es中文社区: https://elasticsearch.cn/

    Elasticsearch 是一个基于Lucene 搜索引擎为核心构建的开源,分布式,RESTful搜索服务器。它是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据。 具体体现在全文检索、结构化搜索、分析以及这三个功能的组合。

    准实时

    es环境配置

    • 首先安装 Java jdk
      • JAVA_HOME
      • 配置环境变量path
    • 然后管理员身份运行bin目录下的bat文件安装es
    • 同上原理安装kibana
      • kibana 一个为es提供数据分析的web接口. 可使用它对日志进行高效的搜索, 可视化, 分析等操作(类似于mysql的客户端)
    • 注意: kibana和es, ik分词版本保持一致

    es数据组织

    对比关系型数据库(不完全正确,方便理解参考)
    数据库	 ---	索引indices
    表	  ----	类型types
    行	 ----	文档documents
    字段	----	字段fields
    
    • 逻辑设计
      • 文档: 索引和搜索数据的最小单位
      • 类型: 文档的逻辑容器(类似于关系型数据库中, 表格是行的容器)
      • 索引: 映射类型的容器, es中的索引是一个非常大的文档集合. 索引存储了映射类型的字段和其他设置, 然后将它们存储到了各个分片上
    • 物理设计
      • 节点
      • 创建一个索引, 默认产生5个主分片, 5个副分片 (对应的主副分片不会在同一台服务器上), 一个分片是一个Lucene索引 (21亿篇文档 / 2740亿个唯一词条)
      • 一个Lucene索引 == 一个包含倒排索引的文件目录
    • 倒排索引: 词条, 对勾, 匹配到的文档都返回, 但是按照匹配度排序
      • 在不全文搜索的情况下返回符合关键字的文档, 建议了解一下其算法
    • 参考博客: https://www.cnblogs.com/Neeo/articles/10571307.html

    es基本操作

    新增数据(JSON形式)
    # PUT 索引名/类型/文档id
    PUT a1/doc/1
    {
      "name":"大郎",
      "age":18
    }
    
    # 更新,version变化
    PUT a1/doc/1
    {
      "name":"武大郎",
      "age":16
    }
    
    # 查找
    GET a1/doc/1
    
    # 查找doc目录下所有,是个字典套列表套字典...
    GET a1/doc/_search
    
    # 删除
    # DELETE 索引名/类型/文档id
    DELETE a1/doc/3
    
    # 全部删除(删除a1索引)
    DELETE a1/
    
    # 修改部分数据
    # POST 索引名/类型/文档id/_update
    POST s22/doc/1/_update
    {
    	"doc": {
    		"age": 27
    	}
    }
    # PUT命令,在做修改操作时,如果未指定其他的属性,则按照指定的属性进行修改操作。所以修改不要用PUT
    
    # 查询所有的索引
    GET _cat/indices?v
    

    es两种查询方式

    #HEAD确认索引是否存在(200/404)
    HEAD s22
    
    查询年龄为18的数据
    #简单搜索(查询字符串搜索)
    GET s22/doc/_search?q=age:18
    
    #DSL查询(重点)
    GET s22/doc/_search
    {
        "query":{
            "match":{
                "age":"18"
            }
        }
    }
    

    match系列

    # match 先分析关键字, 分词, 然后搜索
    GET s22/doc/_search
    {
        "query":{
            "match":{
                "tag":"白 可爱"	#分词拆成"白" "可" "爱"
            }
        }
    }
    
    # match_phrase 短语查询
    GET s22/doc/_search
    {
        "query":{
            "match_phrase":{
                "tag":"可爱"	  #不拆分词
            }
        }
    }
    
    GET t1/doc/_search
    {
        "query":{
            "title":{
                "query": "中国世界",
                "slop": 1		# 词之间的间隔
            }
        }
    }
    
    
    # match_all 查询所有
    GET s22/doc/_search
    {
        "query":{
            "match_all":{}
        }
    }
    

    今日内容

    基础操作

    排序 ( 先查后排 )

    GET s22/doc/_search
    {
      "query": {
        "match_all": {}
      },
      "sort": [			#与query平级
        {
          "FIELD": {
            "order": "desc"  #字段 降序(asc升序)
          }
        }
      ]
    }
    
    不是所有字段都能排序
    

    分页

    GET s22/doc/_search
    {
      "query": {
        "match_all": {}
      },
      "from": 0,	#从第几条开始
      "size":2		#返回几条
    }
    

    bool查询

    # 并且must
    # 查询city是广州的,并且年龄25 (注意两个match的位置,must是个列表)
    GET s22/doc/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "city": "广州"
              }
            },
            {
              "match": {
                "age":25
              }
            }
          ]
        }
      }
    }
    
    # 或者should
    # 查询city是广州的,或者年龄22
    GET s22/doc/_search
    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "city": "广州"
              }
            },
            {
              "match": {
                "age": 22
              }
            }
          ]
        }
      }
    }
    
    # 非must_not
    #查询city不是广州,年龄又不是29的
    GET s22/doc/_search
    {
      "query": {
        "bool": {
          "must_not": [
            {
              "match": {
                "city": "广州"
              }
            },
            {
              "match": {
                "age":29
              }
            }
          ]
        }
      }
    }
    
    # 过滤filter  范围值
    #查询city是广州,年龄大于23的
    GET s22/doc/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "city": "广州"
              }
            }
          ],
          "filter": {
            "range": {
              "age": {
                "gt": 23,	#"gte"大于等于
                #"lte": 20
              }
            }
          }
        }
      }
    }
    
    # 查询city是广州,或者年龄小于等于28的
    # should和filter一起用的时候,先走filter再走should
    GET s22/doc/_search
    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "city": "广州"
              }
            },
          ],
          "filter": {
            "range": {
              "age": {
                "lte": 28
              }
            }
          }
        }
      }
    }
    
    # 总结:
    must 与关系(相当于and)
    should 或关系(相当于or)
    must_not 非关系(相当于not)
    filter 过滤条件
        range 条件筛选范围
        gt 大于
        gte 大于等于
        lt 小于
        lte 小于等于
    

    对结果过滤 _source

    # 查询city是广州,或者年龄小于等于28的,要求显示结果只保留city和age字段
    GET s22/doc/_search
    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "city": "广州"
              }
            }
          ],
          "filter": {
            "range": {
              "age": {
                "lte": 28
              }
            }
          }
        }
      },
      "_source": ["city","age"]		#与query同级
    }
    

    高亮查询

    #默认版的
    GET s22/doc/_search
    {
      "query": {
        "match": {
          "desc": "成熟"
        }
      },
      "_source": ["成熟"],
      "highlight": {	#高亮
        "fields": {		#指定字段
          "desc": {}
        }
      }
    }
    
    #自定义高亮显示
    GET s22/doc/_search
    {
      "query": {
        "match": {
          "desc": "成熟"
        }
      },
      "_source": ["成熟"],
      "highlight": {
        "pre_tags": "<b style='color:yellow;font-size:20px'>",	#标签的前半部分,可定制style
        "post_tags": "</b>", 	#标签的后半部分
        "fields": {			#字段
          "desc": {}
        }
      }
    }
    

    聚合函数

    #查平均年龄
    GET s22/doc/_search
    {
      "query": {
        "match_all": {}
      },
      "aggs": {
        "my_avg": {		#自己的起的别名
          "avg": {
            "field": "age"
          }
        }
      }
    }
    
    #查最大年龄()
    GET s22/doc/_search
    {
      "query": {
        "match_all": {}
      },
      "aggs": {
        "my_avg": {
          "max": {		# "min"最小; "sum"求和
            "field": "age"
          }
        }
      },
      "from": 0,		# 只返回聚合数据,不用看其余详细数据
      "size": 0
    }
    
    

    分组查询

    #先查后聚合
    GET s22/doc/_search
    {
      "query": {
        "match_all": {}
      },
      "size": 0,
      "aggs": {
        "avg_group": {
          "range": {
            "field": "age",
            "ranges": [
              {
                "from": 15,		#左包右不包
                "to": 20
              },
              {
                "from": 20,
                "to": 25
              },
              {
                "from": 25,
                "to": 30
              }
            ]
          }
        }
      }
    }
    
  • 相关阅读:
    ContactManager示例解析
    CubeLiveWallpaper例子解析
    BluetoothChat例子解析
    推荐一个模板引擎 templateengine
    jQuery plugin: Autocomplete
    乐从网站建设、域名、主机-www.lecong.me-www.lecong.mobi
    C#操作注册表
    .NET模板引擎
    [转]模版引擎AderTemplate源代码分析笔记
    windows服务器文件同步,网站同步镜像
  • 原文地址:https://www.cnblogs.com/straightup/p/13737578.html
Copyright © 2011-2022 走看看