这个我就当自己做笔记了!!!!!!
还是得多用,用多了你可能不知道原理,但你至少会用,更容易理解。
这个技术就相当于你百度一个东西,很多相似的东西都会出来,这个的使用场景和这个差不多,不过在存的时候就得说明是什么查找方法,后面写。。。。
刚开始,可能对很多概念不确定:(概念懒得看就看看标题先了解下)
我们可以和数据库里面的几个概念对应:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
1 索引 index(相当于Database一个库概念):
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产 品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并 且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在 一个集群中,可以定义任意多的索引。
2 类型 type(相当于一个库里面的表概念):
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完 全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平 台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数 据定义另一个类型,当然,也可以为评论数据定义另一个类型。
3 字段Field(相当于表里面的一列概念):
相当于是数据表的字段,对文档数据根据不同属性进行的分类标识。
4 映射 mapping:
mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被 索引等等,这些都是映射里面可以设置的,其它就是处理es里面数据的一些使用规则设置也叫做映射, 按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能 更好。
5 文档 document (相当于一行数据的概念):
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文 档,当然,也可以拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表示, 而JSON是一个到处存在的互联网数据交互格式。 在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之 中,文档必须被索引/赋予一个索引的type。
6 接近实时 NRT:
Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一 个轻微的延迟(通常是1秒以内)。
7 集群 cluster:
一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。 一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为一个节 点只能通过指定某个集群的名字,来加入这个集群。
Elasticsearch 安装:自己找资源吧,我就不多说了(客户端操作的话:
第一种,elasticsearch-head插件(建议,对我这种小白很友好)
第二种,使用elasticsearch提供的Restful接口直接访问
第三种,使用elasticsearch提供的API进行访问)。
api使用就先记着这几个吧:put:相当于创建一个东西,post:添加(修改),delete:删除
查询的话:
(查询文档-querystring查询)POST 192.168.***。***:9200/blog1/article/_search
请求体的话:
{
"query": {
"query_string": {
"default_field": "title",
"query": "搜索服务器"
}
}
}
( 查询文档-term查询)
POST 192.168.220.100:9200/blog1/article/_search
请求体:
{
"query": {
"term": {
"title": "搜索"
}
}
}
两个区别:query_string:搜索之前对搜索的关键词分词 term:对搜索的关键词不分词
IK分词器:
下载啥的自己去看看。
最重要的两个作用:
ik_max_word:会将文本做最细粒度的拆分
比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共 和国、人民、共和国、大会堂、大会、会堂等词语。
ik_smart:会做最粗粒度的拆分
比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。
DSL语句使用:
(1)查询所有索引:GET /_cat/indices?v
(2)删除某个索引:DELETE /skuinfo
(3)新增索引:PUT /user
(4)创建映射:
PUT /user/userinfo/_mapping
{
"properties": {
"name":{
"type": "text",
"analyzer": "ik_smart",//分词用这个
"search_analyzer": "ik_smart"//查词用这个
},
"city":{
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
},
"age":{
"type": "long"
},
"description":{
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
}
}
}
(5)新增文档数据:
PUT /user/userinfo/1
{
"name":"李四",
"age":22,
"city":"深圳",
"description":"李四来自湖北武汉!"
}
(6)修改数据:
#更新数据,id=4
PUT /user/userinfo/4
{
"name":"张三丰",
"description":"在武汉读书,家在武汉!在深圳工作!"
}
(7)删除Document:DELETE user/userinfo/7
(1)查询所有数据:#查询所有 GET /user/_search
(2)根据ID查询:#根据ID查询 GET /user/userinfo/2
(3)Sort排序:
#搜索排序
GET /user/_search
{
"query":{
"match_all": {}
},
"sort":{
"age":{
"order":"desc"
}
}
}
(4)分页:from:从下N的记录开始查询 size:每页显示条数
#搜索排序
GET /user/_search
{
"query":{
"match_all": {}
},
"sort":{
"age":{
"order":"desc"
}
},
"from": 0,
"size": 2
}
(1)term查询
term主要用于分词精确匹配,如字符串、数值、日期等(不适合情况:1.列中除英文字符外有其它值 2. 字符串值中有冒号或中文 3.系统自带属性如_version)
#查询-term
GET _search
{
"query":{
"term":{
"city":"武汉"
}
}
}
(2) terms 查询
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需 要一起去做匹配 。
#查询-terms 允许多个Term
GET _search
{
"query":{
"terms":{
"city":
[
"武汉",
"广州"
]
}
}
}
3)match查询:
GET _search
{
"query": {
"match": {
"city": "广州武汉"
}
}
}
(4)query_string查询:
GET _search
{
"query": {
"query_string": {
"default_field": "city",
"query": "广州武汉"
}
}
}
(3) range 查询
range过滤允许我们按照指定范围查找一批数据。例如我们查询年龄范围
#-range 范围过滤
#gt表示> gte表示=>
#lt表示< lte表示<=
GET _search
{
"query":{
"range": {
"age": {
"gte": 30,
"lte": 57
}
}
}
}
(4)exists
exists 过滤可以用于查找拥有某个域的数据
#搜索 exists:是指包含某个域的数据检索
GET _search
{
"query": {
"exists":{
"field":"address"
}
}
}
(5) bool 查询
bool 可以用来合并多个条件查询结果的布尔逻辑,它包含一下操作符:
must : 多个查询条件的完全匹配,相当于 and。
must_not : 多个查询条件的相反匹配,相当于 not。
should : 至少有一个查询条件匹配, 相当于 or。 这些参数可以分别继承一个过滤条件或者一个过滤条件的数组:
#过滤搜索 bool
#must : 多个查询条件的完全匹配,相当于 and。
#must_not : 多个查询条件的相反匹配,相当于 not。
#should : 至少有一个查询条件匹配, 相当于 or。
GET _search
{
"query": {
"bool": {
"must": [
{
"term": {
"city": {
"value": "深圳"
}
}
},
{
"range":{
"age":{
"gte":20,
"lte":99
}
}
}
]
}
}
}
(6) match_all 查询
可以查询到所有文档,是没有查询条件下的默认语句。
#查询所有 match_all
GET _search
{
"query": {
"match_all": {}
}
}
(7) match 查询
match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。 如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析match一下查询字符
#字符串匹配
GET _search
{
"query": {
"match": {
"description": "武汉"
}
}
}
(8)prefix 查询
以什么字符开头的,可以更简单地用 prefix ,例如查询所有以张开始的用户描述
#前缀匹配 prefix
GET _search
{
"query": {
"prefix": {
"name": {
"value": "赵"
}
}
}
}
(9)multi_match 查询
multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个
#多个域匹配搜索
GET _search
{
"query": {
"multi_match": {
"query": "深圳",
"fields": [
"city",
"description"
]
}
}
}
说实话,我觉得最重要的是这九个查询的,和数据库查询的差不多了。