elasticSearch基础学习笔记

1.什么是 restFul ?

定义:如果一个架构符合rest设计,就称这个架构为RestFul架构

​ RestFul 是一种软件架构风格

2.什么Rest?

​ REST其实是Fielding博士提出一种基于网络的软件架构设计风格,其英文全称是“Representational(表现层) State(状态) Transfer(传输|转化)”,翻译成中文为“表述性状态转移”。对REST更通俗的解释就是:它是软件架构的一种分类,我们把具有某一组特征的软件架构设计称之为REST Style。

Rest设计原则:

​ 1.使用REST的URL替换传统URL请求

​ 传统URL:http://localhost:8989/xxx/find?id=21

​ RestURL: http://localhost:8989/xxx/find/21/

​ 2.使用Http四种动词对应服务器四种操作:CRUD 资源增删改查

​ HTTP动词: GET 查询获取资源 POST 更新操作 PUT 添加操作 DELETE 删除

全文检索

1.什么是全文检索

​ 定义:全文检索是计算机程序通过扫描文章中的每一个词,对每个词建立一个索引,

指明该词在文章中出现的次数和位置。当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程

Es中的重要概念

es 特点

1.只处理文本 不处理语义

2.搜索时不区分大小写

3。搜索结果存在相关度排序

索引操作

a.创建索引 PUT /索引名 注意:索引名必须全部由小写字母组成

b. 查看所有索引 GET _cat/indices?v

c. 查看所有索引 GET /索引名

d.删除索引 DELETE /索引名

e.删除所有所有索引 DELETE/*

2.创建索引(Index)和类型(type)和映射(mapping) 注意?:在 6.x一个索引只能创建一个索引

类型(type):keywrod|text|ip|boolean|interger|long|double|date

PUT /ems
{
    
    
  "mappings": {
    
    
        "emp":{
    
    
            "properties": {
    
    
              "id":{
    
    "type":"keyword"},
               "name":{
    
    "type":"keyword"},
              "age":{
    
    "type": "integer"},
              "bir":{
    
    "type": "date"}
            }
        }
    
  }
}

3.查看索引类型和映射

GET /索引名/_mapping

GET /ems/_mapping

4.文档操作

添加手动指定_id

PUT /ems/emp/1
{
    
    
  "id":"123",
  "name":"张三",
  "age":33,
  "bir": "2018-01-13"
}

添加自动生成_id

POST /ems/emp
{
    
    
  "id":"123",
  "name":"张三",
  "age":33,
  "bir": "2018-01-13"
}

查询文档

GET /ems/emp/_id的值

更新文档

//第一种方式   跟新原有的数据
POST /dangdang/book/1/_update
{
    
    
  
  "doc":{
    
    
    "name":"小白杨故事123"
  }
}

//第二 种方式  添加新的数据
POST /dangdang/book/1/_update
{
    
    
  
  "doc":{
    
    
    "name":"小白杨故事123",
    "dec":"sdsd"
  }
}


//第三种   在原来的基础上更新
POST /dangdang/book/1/_update
{
    
    
  "script": "ctx._source.price+=5.5" 
 
}

删除文档

DELETE /dangdang/book/1

批量操作(每个操作互不影响)

POST /dangdang/book/_bulk
{
    
    "index":{
    
    "_id":"5"}}
   {
    
    "name":"zhangssan","content":"this is good zhangsan","price":76.9,"update":"2019-07-09"}
{
    
    "delete":{
    
    "_id":"5"}}
{
    
    "index":{
    
    }}
  {
    
    "name":"lisi","content":"this is good lisi","price":76.9,"update":"2019-7-09"}
{
    
    "update":{
    
    "_id":"1"}}
  {
    
    "doc":{
    
    "name":"ss"}}

ES 官方提供两种检索方式

a.使用URL参数形式进行检索(query as a paremeter)

b.使用DSL(特殊领域查询语言)方式(Request Body) 方式检索

测试数据

PUT  /ems 
{
    
    
  "mappings": {
    
    
      "emp":{
    
    
        "properties": {
    
    
          "name":{
    
    "type": "keyword"},
          "age":{
    
    "type": "integer"},
          "bir":{
    
    "type": "date"},
          "content":{
    
    "type": "text"},
          "address":{
    
    "type": "keyword"}
        }
      }
     
  }
}

PUT /ems/emp/_bulk
{"index":{}}
  {"name":"王小黑","age":24,"bir":"2012-12-12","content":"深刻的思考","address":"北京"}
{"index":{}}
  {"name":"张小五","age":8,"bir":"2012-12-12","content":"女外恐怕怕【我","address":"北京"}
{"index":{}}
  {"name":"哇in","age":9,"bir":"2012-12-12","content":"拍了的方式","address":"北京"}
{"index":{}}
  {"name":"超长线","age":43,"bir":"2012-12-12","content":"米宽","address":"北京"} 
{"index":{}}  
    {"name":"小黑","age":23,"bir":"2012-12-12","content":"未开放闲着一款吗mvc框架","address":"北京"}

1.URL 检索方式

GET /ems/emp/_search?q=* //查询所有

执行结果

{
    
    
  "took": 17,//执行时间 17毫秒
  "timed_out": false,//是否超时
  "_shards": {
    
    //分片  es 默认是以集群方式 , 
    "total": 5,//默认 是5个主分片 ,5个主分片组合到一起,是个完整的数据,每一个分片可以独立检索
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    
    //击中的总数
    "total": 5,//总数
    "max_score": 1,//最大得分
    "hits": [
      {
    
    
        "_index": "ems",
        "_type": "emp",
        "_id": "xvWNPXQBPT1o2SdnaypZ",
        "_score": 1,
        "_source": {
    
    
          "name": "哇in",
          "age": 9,
          "bir": "2012-12-12",
          "content": "拍了的方式",
          "address": "北京"
        }
      },
      {
    
    
        "_index": "ems",
        "_type": "emp",
        "_id": "w_WLPXQBPT1o2Sdnoyrk",
        "_score": 1,
        "_source": {
    
    
          "name": "小黑",
          "age": 23,
          "bir": "2012-12-12",
          "content": "未开放闲着一款吗mvc框架",
          "address": "北京"
        }
      },
      {
    
    
        "_index": "ems",
        "_type": "emp",
        "_id": "xPWNPXQBPT1o2SdnaypY",
        "_score": 1,
        "_source": {
    
    
          "name": "王小黑",
          "age": 24,
          "bir": "2012-12-12",
          "content": "深刻的思考",
          "address": "北京"
        }
      },
      {
    
    
        "_index": "ems",
        "_type": "emp",
        "_id": "xfWNPXQBPT1o2SdnaypZ",
        "_score": 1,
        "_source": {
    
    
          "name": "张小五",
          "age": 8,
          "bir": "2012-12-12",
          "content": "女外恐怕怕【我",
          "address": "北京"
        }
      },
      {
    
    
        "_index": "ems",
        "_type": "emp",
        "_id": "x_WNPXQBPT1o2SdnaypZ",
        "_score": 1,
        "_source": {
    
    
          "name": "超长线",
          "age": 43,
          "bir": "2012-12-12",
          "content": "米宽",
          "address": "北京"
        }
      }
    ]
  }
}

排序并分页

GET /ems/emp/_search?q=*&sort=age:desc&size=2

参量

URI中允许的参数是:

名称 描述
q 查询字符串(映射到query_string查询,请参阅 查询字符串查询以获取更多详细信息)。
df 在查询中未定义任何字段前缀时使用的默认字段。
analyzer 分析查询字符串时要使用的分析器名称。
analyze_wildcard 是否应分析通配符和前缀查询。默认为false
batched_reduce_size 分片结果的数量应在协调节点上立即减少。如果请求中的分片数量可能很大,则此值应用作保护机制以减少每个搜索请求的内存开销。
default_operator 要使用的默认运算符可以是ANDOR。默认为OR
lenient 如果设置为true,将导致忽略基于格式的错误(例如,向数字字段提供文本)。默认为false。
explain 对于每个匹配,请说明如何计算匹配得分。
_source 设置为false禁用_source字段检索。您还可以使用_source_include&检索文档的一部分_source_exclude( 有关更多详细信息,请参见请求正文文档)
stored_fields 每次命中将返回的文档的选择性存储字段,以逗号分隔。不指定任何值将导致不返回任何字段。
sort 排序执行。可以采用fieldNamefieldName:asc/ 的形式fieldName:desc。fieldName可以是文档中的实际字段,也可以是特殊_score名称以指示基于得分的排序。可以有几个sort参数(顺序很重要)。
track_scores 排序时,设置为true以便仍跟踪分数并将其作为每次命中的一部分返回。
track_total_hits 设置为false,以禁用跟踪与查询匹配的总点击数。(有关更多详细信息,请参见索引排序)。默认为true。
timeout 搜索超时,将搜索请求限制为在指定的时间值内执行,并保全过期时累积到该点的匹配。默认为无超时。
terminate_after 为每个分片收集的最大文档数,达到该数量时,查询执行将提前终止。如果设置,则响应将具有布尔值字段,terminated_early以指示查询执行是否实际上已终止。默认为no terminate_after。
from 从匹配的索引开始到返回。默认为0
size 返回的点击数。默认为10
search_type 要执行的搜索操作的类型。可以是 dfs_query_then_fetchquery_then_fetch。默认为query_then_fetch。有关可以执行的不同搜索类型的更多详细信息,请参见 搜索类型
allow_partial_search_results false如果请求将产生部分结果,则设置为返回整体失败。默认值为true,这将在超时或部分失败的情况下允许部分结果。

2.DSL 检索方式

1.查询所有(match_all)

GET /ems/emp/_search
{
    
    
  "query": {
    
    "match_all": {
    
    }}
}

2.查询所有返回指定条数(size)

GET /ems/emp/_search
{
    
    
  "query": {
    
    "match_all": {
    
    }},
  "size": 4
}

3.分页(from)

GET /ems/emp/_search
{
    
    
  "query": {
    
    "match_all": {
    
    }},
  "size": 2,
  "from": 1   (pageno-1)*pagesaize
}

4.排序(sort)

GET /ems/emp/_search
{
    
    
  "query": {
    
    "match_all": {
    
    }},
  "sort": [
    {
    
    
      "age": {
    
    
        "order": "desc"
      }
    }
  ],
  "size": 2,
  "from": 0
}

5.查询结果中返回指定字段(_source)



GET /ems/emp/search
{
    
    
  "query": {
    
    "match_all": {
    
    }},
  "_source": ["name","age"]
}

6.关键词查询(term)

GET  /ems/emp/_search
{
    
    
   "query": {
    
    
     "term": {
    
    
       "age": {
    
    
         "value": "24"
       }
     }
   } 
}

总结:

​ 通过使用term得知,第一个除了text类型以外的所有类型均不分词

第二个ES默认使用的标准分词器(英文单词分词 中文单字分词)

7.范围查询(range)

GET /ems/emp/_search
{
    
    
  "query": {
    
    
    "range": {
    
    
      "age": {
    
    
        "gte": 10,  gte//大于等于  gt//大于
        "lte": 55   lte //小于等于  lt//小于
      }
    }
  }
}

8.前缀查询(prefix)

GET  /ems/emp/_search
{
    
    
  "query": {
    
    
    "prefix": {
    
    
      "name": {
    
    
        "value": "小"
      }
    }
  }
}

9.通配符查询(wildcard)

*  表示零到多个字符
?  表示一个字符
GET /ems/emp/_search
{
    
    
 "query": {
    
    
   "wildcard": {
    
    
     "name": {
    
    
       "value": "王*黑"
     }
   }
 }
}

10.多id查询(ids)

GET /ems/emp/_search
{
    
    
  "query": {
    
    
    "ids": {
    
    
      "values":      ["xPWNPXQBPT1o2SdnaypY","w_WLPXQBPT1o2Sdnoyrk"]
    }
  }
}

11.模糊查询(fuzzy)

fuzzy关键字:用来模糊查询含有指定关键字的文档,注意:允许出现的错误必须在0-2之间

GET /ems/emp/_search
{
    
    
  "query": {
    
    
    "fuzzy": {
    
    
       "content": "vvc" //正确  mvc 
    }
  }
}
#注意:最大编辑距离为 0 1 2
如果关键词为2长度    0..2  必须完全匹配
如歌关键词长度为3..5之间    允许一个错误
如歌关键词长度>5  最多允许两个错误

12.布尔查询(bool)

bool 关键字:用来组合多条件实现复杂查询

must:相当于&&同时成立

should :相当于|| 成立一个就行

must_not :相当于!不能满足任何一个

GET /ems/emp/_search
{
    
    
  "query": {
    
    
    "bool": {
    
    
      "must": [
        {
    
    "wildcard": {
    
    
          "content": {
    
    
            "value": "s*"
          }
        }}
      ],
      "must_not": [
        {
    
    
          "ids": {
    
    
            "values": ["xPWNPXQBPT1o2SdnaypY"]
          }
        }
      ]
    }
    
  }
}

13.多字段查询(multi_match)

注意:使用这种方式进行查询是为了更好获取结果,在查询过程中先将查询条件根据当前的分词器分词之后进行查询

GET /ems/emp/_search
{
    
    
  "query": {
    
    
    "multi_match": {
    
    
      "query": "中国",
      "fields": ["name","content"] # 这里写要检索的指定字段
    }
  }
  
}

14.多字段分词查询(query_string)

注意:使用这种方式进行查询是为了更好获取结果,在查询过程中先将查询条件根据当前的分词器分词之后进行查询

GET /ems/emp/_search
{
    
    
  "query": {
    
    
      "query_string": {
    
    
    
        "query": "中国声音",
        "fields": ["name","content"], 
        "analyzer": "standard"//指定分词器
      }
  }
}

15.高亮查询

GET /ems/emp/_search
{
    
    
  "query": {
    
    
    "term": {
    
    
      "content": {
    
    
        "value": "框"
      }
    }
  },
  "highlight": {
    
    
     "fields": {
    
    "*": {
    
    }},
     "pre_tags": ["<span style='color:red'>"],
     "post_tags": ["</span>"],
     "require_field_match":false
  }
}

执行结果

{
    
    
  "took": 81,
  "timed_out": false,
  "_shards": {
    
    
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    
    
    "total": 1,
    "max_score": 0.89787805,
    "hits": [
      {
    
    
        "_index": "ems",
        "_type": "emp",
        "_id": "w_WLPXQBPT1o2Sdnoyrk",
        "_score": 0.89787805,
        "_source": {
    
    
          "name": "小黑",
          "age": 23,
          "bir": "2012-12-12",
          "content": "未开放闲着一款吗mvc框架",
          "address": "北京"
        },
        "highlight": {
    
    
          "content": [
            "未开放闲着一款吗mvc<span style='color:red'>框</span>架"
          ]
        }
      }
    ]
  }
}

es 索引器的原理

分词器

ik分词器plugin方式安装

进入elasticsearch的bin路径,执行如下命令:

elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.2/elasticsearch-analysis-ik-6.3.2.zip

执行完后,重启elasticsearch,ik安装完毕。

查看测试分词器

GET _analyze
{
    
    
  "analyzer": "ik_max_word",
  "text": "redis  非常好用"
}

在mapping中使用ik分词器

"properties":{
    
    
     "name":{
    
    
        "type":"text",
        "analyzer":"ik_max_word|ik_smart"
     }
}

ik中自定一扩展词和停用词

ES中的查询

filter query语法

term过滤

GET  /dangdang/book/_search
{
    
    
  "query": {
    
    
     "bool": {
    
    
        "must": [
          {
    
    "term": {
    
    
            "content": {
    
    
              "value": "小红"
            }
          }}
        ],
        "filter": {
    
    
           "term": {
    
    
             "sex": "女"
           }
        }
     }
  }
  
}

terms

GET  /dangdang/book/_search
{
    
    
  "query": {
    
    
     "bool": {
    
    
        "must": [
          {
    
    "term": {
    
    
            "content": {
    
    
              "value": "小红"
            }
          }}
        ],
        "filter": {
    
    
           "terms": {
    
    
             
             "content":[
                 "小",
                 "书"
               ]
           }
        }
     }
  }
  
}

range范围查询

GET  /dangdang/book/_search
{
    
    
  "query": {
    
    
     "bool": {
    
    
        "must": [
          {
    
    "term": {
    
    
            "content": {
    
    
              "value": "小红"
            }
          }}
        ],
        "filter": {
    
    
           "range": {
    
    
             "age": {
    
    
               "gte": 10,
               "lte": 30
             }
           }
        }
     }
  }
  
}

exsts filter

过滤存在指定字段,获取字段不为空的索引记录使用

GET  /dangdang/book/_search
{
    
    
  "query": {
    
    
     "bool": {
    
    
        "must": [
          {
    
    "term": {
    
    
            "content": {
    
    
              "value": "小红"
            }
          }}
        ],
        "filter": {
    
    
           "exists": {
    
    
             "field": "name"
           }
        }
     }
  }
  
}

ids

GET  /dangdang/book/_search
{
    
    
  "query": {
    
    
     "bool": {
    
    
        "must": [
          {
    
    "term": {
    
    
            "content": {
    
    
              "value": "小红"
            }
          }}
        ],
        "filter": {
    
    
           
         "ids": {
    
    
           "values": [
             "10","20"
           ]
         }
        }
     }
  }
  
}

spring boot spring data 整合

应用场景

代码地址:https://gitee.com/zhanchengyang/learning

猜你喜欢

转载自blog.csdn.net/lmsfv/article/details/109646248