elasticsearch+ik+kibana

前言

1、elasticsearch是什么?为什么要使用它

度娘的解释:

  • Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

主要:

  • Elasticsearch是一个基于Lucene的搜索服务器
  • Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎
  • Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene

已经有mysql这种数据库了,为什么还要Es?

  • Es理论是哪个也是数据库,不过术业有专攻,Es他的特点主要是搜索引擎
  • mysql这种数据库的搜索方式主要数精确匹配(其中包括模糊搜索)
    例如:你想搜索“毛主席”,那么你的mysql只能“select * from table where ‘%毛主席%’”
    这显然是不够的,
  • Es主要是在当前的大数据时代下,模拟人的思维,做出的相关性匹配
    例如:搜索“主席”,不可能仅仅只是这样子,我们可能还需要“姓名”、“伟人”、“中华人民共和国第一任主席”等等,相关的搜索
  • 总结:Es比其他的数据库(关系型数据库)搜索效率更高,结果数据更优秀

2、ik

ik 是一个分词器

3、kibana

Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示

elastic的 一些DDL语句

#获取所有索引库
GET _cat/indices?v

#新增索引库
PUT /user

#添加映射
PUT /user/userinfo/_mapping
{
  "properties":{
    "name":{
      #字段类型 text可以被分词,keywords只能进行精确匹配
      "type":"text",
      # 指定分词器
      "analyzer":"ik_smart",
      # 搜索指定分词器,搜索是优先级最高
      "search_analyzer":"ik_smart",
      #是否开辟独立空间,否则在_source中存储
      "store":false
      #index:no 不能被搜索
    },
    "city":{
      "type":"text",
      "analyzer":"ik_smart",
      "search_analyzer":"ik_smart",
      "store":false
    },
    "age":{
      "type":"long",
      "store":false
    },
    "description":{
      "type":"text",
      "analyzer":"ik_smart",
      "search_analyzer":"ik_smart",
      "store":false
    }
  }
}
#添加文档数据  id =1 注:只能是put请求
PUT /user/userinfo/1
{
  "name":"",
  "age":10,
  "city":"",
  "description":""
}
PUT /user/userinfo/2
{
  "name":"李四",
  "age":20,
  "city":"武汉",
  "description":"我在武汉,但是家在福建",
  "address":"福建"
}
PUT /user/userinfo/3
{
  "name":"王五",
  "age":30,
  "city":"福建",
  "description":"我是武汉人"
}
PUT /user/userinfo/4
{
  "name":"赵柳",
  "age":50,
  "city":"福建",
  "description":"我是北京人"
}
PUT /user/userinfo/5
{
  "name":"张三",
  "age":40,
  "city":"北京",
  "description":"我是北京人,但是在武汉工作"
}
#删除数据
DELETE  /user/userinfo/5
#根据Id查数据
GET /user/userinfo/4
#查询所以数据
GET /user/userinfo/_search

#修改一:替换
PUT /user/userinfo/4
{
  "name":"赵六",
  "description":"第一次修改"
}
# 替换直接将所有数据都替换,删除原始数据
# 例如:你没有输入city,所以替换之后就没有数据

#修改二:更新,只会修改指定数据
POST /user/userinfo/4/_update
{
  "doc":{
     "name":"赵六",
   "description":"第一次修改"
  }
}

#降序搜索 例如:age
#  asc升序  desc降序
GET /user/userinfo/_search
{
  #query查询关键字
  "query": {
     //match_all 全部搜索
    "match_all": {}
  },
  # sort 排序
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

# 分页查询
# from 从第几条数据开始,size  每页数据的数量
GET /user/userinfo/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],

  "from": 1,
  "size": 2
}
################过滤################
# 词项(分组)搜索,搜索指定属性 ;例:city,age,name
GET /user/userinfo/_search
{
  "query": {
    "term": {
      "city": {
        "value": "福建"
      }
    }
  }
}

# 多个词项搜索  terms
GET /user/userinfo/_search
{
  "query": {
    "terms": {
      "city": [
        "福建",
        "北京"
      ]
    }
  }
}

# 范围搜索
#  gte小于    lte大于
#  可添加排序
GET /user/userinfo/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 30
      }
    }
  },
  "sort": [
    {
      "age": {
        "order": "asc"
      }
    }
  ]
}

# 查询存在 address域的数据
GET /user/userinfo/_search
{
  "query": {
    "exists":{
      "field":"address"
    }
  }
}

# 组合查询 bool组合
# must      相当于and
# must_not  相当于not
# should    相当于or
# 查询 住在福建,年龄30-40的用户
GET /user/userinfo/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "city": {
              "value": "福建"
            }
          }
        },
        {
          "range": {
            "age": {
              "gte": 30,
              "lte": 40
            }
          }
        }
      ]
    }
  }
}

#  模糊搜索
GET /user/userinfo/_search
{
  "query": {
     #match 全文搜索,可以分词
    "match": {
      "description": "福建"
    }
  }
}

#如果出问题 ,可能是分词出问题了
#可以去自定义分词

# 第一个字搜索,例如:姓赵
GET /user/userinfo/_search
{
  "query": {
    "prefix": {
      "name": {
        "value": "赵"
      }
    }
  }
}

#跨域模糊搜索
GET /user/userinfo/_search
{
  "query": {
    "multi_match": {
      "query": "福建",
      "fields": ["city","description"]
    }
  }
}

#高亮搜索highlight
GET /user/userinfo/_search
{
  "query": {
    "match": { "name": "javascript" }
  },
  
  "highlight": {
  # 多字段高亮 require_field_match false
    "require_field_match": false,
    "fields": {
      "name": {},
      "description": {}
    }
  }

小总结

     query-[match/match-all/multi_match]  匹配/查询全部(没有条件)/混合匹配,会使用分词器解析
     query-bool-[should/must/must-no]     or/and
     highlight                            高亮查询
     query-range                          范围查询
     query-sort                           排序
     query-terms                          分组
     query-term                           精确查询
     _source                              查询时显示的字段
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值