前言
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 查询时显示的字段