安装:

  ES数据库安装挺麻烦的,安装完数据库之后还要安装各种插件(ik分词,head集群管理工具,bigdesk集群监控工具可以看到cpu,内存,索引,http连接数,搜索等情况,)es数据库并没有悲观察锁的机制,乐观锁是通过文档默认字段_version实现的,分别是两种方式:内部版本控制:指定的version必须要 = 文档目前的_version,否则就报error。如果符合就修改成功,并且把文档version自增1。外部版本控制:搭配version_type=external,指定的version必须 > 文档目前的_version,否则就报error。如果符合就修改成功,并且把文档version直接变成指定的。

Es 概念以及特点

  1、Elasticsearch和MongoDB/Redis/Memcache一样,是非关系型数据库。是一个接近实时的搜索平台,从索引这个文档到这个文档能够被搜索到只有一个轻微的延迟,企业应用定位:采用Restful API标准的可扩展和高可用的实时数据分析的全文搜索工具。

  2、可拓展:支持一主多从且扩容简易,只要cluster.name一致且在同一个网络中就能自动加入当前集群;本身就是开源软件,也支持很多开源的第三方插件。

  3、高可用:在一个集群的多个节点中进行分布式存储,索引支持shards和复制,即使部分节点down掉,也能自动进行数据恢复和主从切换。

  4、采用RestfulAPI标准:通过http接口使用JSON格式进行操作数据。

  5、数据存储的最小单位是文档,本质上是一个JSON 文本。

采用倒排索引,value>iD,侧重于结构性检索统计,不适合做数据存储,很难修改属性类型,没有用户验证和权限控制,添加字段可以通过添加不同type来做,每次查询的时候,使用doctype-*来搜索,支持

基本操作:

  在这之前先了解下ES的5个请求方式:
    PUT:新增
    POST:修改
    DELETE:删除
    GET或HEAD:查询,区别是HEAD不会返回响应体,只有响应头。

Kibana命令:

 

# 添加数据  
    POST order/order_item/
    {
      "id":100,
      "message":"测试",
      "price":10.09,
      "tid":"S215488888"
    }  # 修改和新增是一样的命令,如果id存在那就是修改,不存在就是新增,需要注意的是如果我们只修改一个字段的值,不能直接像下面这样操作,更改价格。
    POST order/order_item/100
    {
      "price":22.06
    }
    // 因为执行后就只剩下price这个字段了。应该按下面操作
    POST index/type/id/_update
    {
        "doc" : {
            "name" : "new_name"
        }
    }  # 根据条件批量修改将所有 NICK是体育旗舰店的数据中的ORDERSIGN修改为“222222”,INVOICE_INFO修改为“开具发票”。
    POST index/type/_update_by_query
    {
      "script":{
        "inline":"ctx._source.ORDERSIGN='222222';ctx._source.INVOICE_INFO='开具发票';"
      },
      "query":{
        "term":{
          "NICK": "体育旗舰店"
        }
      }
    }    或者
    POST index/type/_update_by_query
    {
      "script": {
        "lang": "painless",
        "inline": "if(ctx._source.INVOICE_INFO== '发票'){ctx._source.INVOICE_INFO= '开具发票'}  if(ctx._source.DELIVERY_TYPE==     '任意'){ctx._source.DELIVERY_TYPE= '任意时间 '}"
      }
    }   //多个if之间是或的关系。lang=painless表示使用painless脚本语言来编写script来完成。   # 删除
    #根据id删除:DELETE /index/type/1
    #路由删除:DELETE /index/type/1?routing=kimchy
    #超时删除:DELETE /index/type/1?timeout=5m
    #删除所有:POST index/type/_delete_by_query
      {
        "query": {
          "match_all": {}
        }
      }
    #按条件删除POST index/type/_delete_by_query
      {
        "query": { 
          "match": {
            "your key": "your value"
          }
        }
      }
  #查询
  #根据id查询
    如果知道id,可以根据id直接查询GET index/type/id
  #条件查询
    查询总记录数,类似与MySQL中select count(*) from xx
    GET index/type/_count
  #查询所有    GET index/type/_search
    {
      "query": {
        "match_all": {}
      }
    }
query代表查询对象,match_all是查询对象的属性,代表匹配属性或者匹配级别,除了match_all,还有 multi_match,match,term , range ,bool等。
有时候返回的字段太多,其实我们只需要个别字段,可以使用过滤。
a.直接指定返回字段:  GET order/order_item/_search
    {
      "_source": ["message","oid"],
      "query": {
        "match_all": {}
      }
    }
b.使用includes(include)和excludes(exclude),一个是包含,一个是排除。
include只能指定一个字段,所以已经被弃用。  GET order/order_item/_search
    {
      "_source": {
      "include": "tid"
      },
      "query": {
        "match_all": {}
      }
    }
这个效果和下面是一样的:  GET index/type/_search
    {
      "_source": "tid",
      "query": {
        "match_all": {}
      }
    }
而includes可以指定多个字段  GET order/order_item/_search
    {
      "_source": {
        "includes":["tid","message"]
      },
     "query": {
        "match_all": {}
      }
    }
excludes和exclude的区别和使用一样。
c.根据id查询,并且需要指定返回字段  GET index/type/id?_source=tid,message

multi_match代表多字段匹配
下面示例会在OWNERENAME和PS_C_BRAND_ENAME两个字段中都含有“系统”的查询出来  GET index/type/_search
    {
        "query":{
            "multi_match": {
                "query":"系统",
                "fields":   [ "OWNERENAME", "PS_C_BRAND_ENAME" ]
            }
	    }
    }
match代表匹配查询
示例会将字段message中含有系统或者管理员的都查出来,如果没有,检查下ES的分词器。  GET index/type/_search
    {
        "query":{
            "match":{
                "message":"系统管理员"
            }
        }
    }
如果想精确匹配,值查询messgae是“系统管理员”,使用逻辑符operator绑定查询,如下。  GET index/type/_search
    {
        "query":{
            "match": {
              "message": {
                "query": "系统管理员",
                "operator": "and"
              }
            }
        }
    }
term 代表精确值匹配
和使用operator绑定查询效果类似,但是可以使用在数字、时间上。  GET index/type/_search
    {
        "query":{
            "term":{
                "message":"系统管理员"
            }
        }
    }range代表范围查询
示例将价格在100到1000的数据查询出来。  GET index/type/_search
    {
        "query":{
            "range": {
                "price": {
                    "gte":  100,
                    "lt":   1000
                }
    	    }
        }
    }bool查询
must(与)、must_not(非)、should(或),说明下,ES中的逻辑与或非是针对分词来说的,比如下面是messge这个字段不能包含“哈哈”,而不是等于。  GET order/order_item/_search
    {
      "query": {
        "bool": {
         "must": [
           {
             "match": {
               "price":10.09
             }
           }
         ],
         "must_not": [
           {
             "match": {
               "message":"哈哈"
             }
           }
         ],
         "should": [
           {
            "match": {
             "tid":"S215488888"
            }
           }
         ]
        }  
      }
    }
from–size查询
这个类似与MySQL的limit,from是起始位置,size是偏移量。  GET index/type/_search
    {
      "from": 0,
      "size": 3,
      "query": {
        "match_all": {}
      }
    }
排序查询
根据id倒叙查询所有,多字段排序以逗号分隔。  GET index/type/_search
    {
      "sort": [
        {
             "ID": "desc",
            "TID": "desc"
        }
      ],
      "query": {
        "match_all": {}
      }
    }
或者这样  GET index/type/_search
    {
      "sort": [
        {
          "ID": {
            "order": "desc"
          },
          "TID": {
            "order": "desc"
          }
        }
      ], 
      "query": {
        "match_all": {}
      }
    }
骚写法比较多,也可以这样  GET index/type/_search
    {
        "sort": [
          { "ID": { "order": "desc" }},
          { "TID": { "order": "desc" }}
        ],
        "query": {
          "match_all": {}
        }
    }
ES提供的查询比较强大,除了上面的,还有过滤,排序,聚合等,后面用到再补上,这些查询可以任意搭配组合,满足各种情况的查询。  # 创建索引名为order 的索引:
    PUT order
      {
        "settings": {
          "number_of_shards" : "5",
          "number_of_replicas" : "1"
        }
      }        ////number_of_shards是设置分片数量,number_of_replicas是设置副本数量。当然可以直接PUT order创建,这样两者默认值分别是5和1。  # 查询索引:GET order       /        GET order/_settings
    _all和 * 都是进行模糊匹配,所以可以使用GET * 或者GET _all 来查询所有的索引,也可使用GET test* 来匹配test开头的。
  # 删除索引:DELETE order   // 谨慎使用通配符
浏览器带接口执行:
//localhost:9200/movies
  # 查看索引状态:http://ds0:9200/_cat/indices?v          //浏览器中执行
  # 添加索引信息(更新索引信息=》相同的索引,相同的类型,相同的ID):
    PUT http://ds0:9200/movies/movie/1
      {
          "title": "The Godfather",
          "director": "Francis Ford Coppola",
          "year": 1972
      }  # 获取文档或索引:GET http://ip:port/索引/类型/ID
  # 更新文档内容:
    http://ds0:9200/secisland/secilog/1/_update/      {
      "doc":{
      "computer":"secisland",
      "message":"secisland is an security computer.It provides log analysis products"
      }
      }  # 删除文档或索引:DELETE  http://ip:port/索引名/类型名/ID
  # _search 端点用于搜索: <index>/<type>/_search     //其中index和type都是可以去掉的
聚合查询:
# 没有这个字段的查找
  GET tyjatip-threatbook-text/_search 
    {   
      "aggs": {
        "account_missing": {
          "missing": {
            "field": "ioc_type"
          }
        }
      }
    }# 查询全部ioc_type占多少, 只能查询long 类型的
  POST texttip-nitsc-one/_search
    {
      "track_total_hits": true,
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "query": "*"
              }
            },
            {
              "range": {
                "timestamp": {
                  "gte": "2020-06-29T13:29:20Z"
                }
              }
            }
          ]
        }
      },
      "aggs": {
        "ioc_type": {
          "terms": {
            "field": "ioc_type.keyword"
          }
        }
      },
      "size": 0
    }# 统计confidence字段的10,和75的占比
  GET  texttip-nitsc-one/_search 
    {
        "size": 0, 
        "aggs": {
          "tests_confidence": {
            "percentile_ranks": {
              "field": "confidence",
              "values": [
                1,75
              ]
            }
          }
        }
    }# percentiles对指定字段(脚本)的值按从小到大累计每个值对应的文档数的占比(占所有命中文档数的百分比),返回指定占比比例对应的值。默认返回[ 1, 5, 25, 50, 75, 95, 99 ]分位上的值
  GET texttip-nitsc-one/_search 
    {
        "size": 0, 
        "aggs": {
          "tests_confidence":{
            "percentiles": {
              "field": "intelclass",
              "percents": [
                "indicator"
              ]
            }}}
    }# 计算分数的平均值
  GET tyjatip-threatbook-text/_search 
    {
      "size": 0,
      "aggs": {
        "avg_confidence": {
          "avg": {
            "field": "confidence"}}}
    }# 大于某个数的,然后求平均值,基于范围
  GET tyjatip-threatbook-text/_search 
    {
      "size": 0,
      "query": {
        "range": {
          "confidence": {
            "gte": 0,
            "lte": 75}}},
      "aggs": {
        "avg_confidence": {
          "avg": {
            "field": "confidence"}}}
    }# 多值聚合 存在这个字段的,有多少个这个值
  GET tyjatip-threatbook-two/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "terms": {
                "ioc": [
                  "77.29.120.69",
                  "14.186.151.119"
                ]
              }
          },
            {
              "terms": {
                "ioc_type": [
                  "ipv4"
                ]
              }
            }
          ]
        }
    },
        "aggs": {
          "raw.ioc": {
            "terms": {
              "field": "row.ioc.keyword"
            }
        },
          "raw.ioc_type": {
            "terms": {
              "field": "row.ioc_type.keyword"
            }
          }
      },
      "size": 0  }
# 查询前缀
  {
      "query": {
        "bool": {
          "must": [ 
            {
                  "prefix": {
                    "raw.id": "campaign"              }
            }
          ]
        }
    },
      "size": 0
  } 
# 为索引增加别名
  POST _aliases
    {
      "actions" : [{"add" : {"index" : "texttip-nitsc-one" , "alias" : "nitsc-intel-repo"}}]
    }# 查看别名
  GET texttip-nitsc-one/_alias/*

在URL后面添加?pretty的意义

  • 在任意的查询字符串中增加pretty参数,会让Elasticsearch美化输出(pretty-print)JSON响应以便更加容易阅读。不包含(_source,这个字段由用户输入时的格式一致)

python-ES:

ES:插入es.index() 获取es.get() 删除es.delete()搜索:es.search()
  多值的搜索用body中的bool{“must”:[{}{}]}
  切片:from:2,size2从第二页开始,显示两个
  范围:range:gte,lte
  排序:sort

  Script: 脚本,可以用来做更新搜索等等功能,直接在body里面添加{“script”:”脚本”}

  原始查询使用网址链接进行查询的,通过网络的协议(get/post/put/delete...)进行增删改查,这个可以根据不同的语言自己定制

不定期持续更新文档.......