es倒排索引、索引操作、文档操作

es倒排索引、索引操作、文档操作

1. 倒排索引

反向索引,把文章进行分词建立索引

2. 索引操作

类似于数据库的增删改查操作

1. 新增索引

PUT sy   # sy就是索引名字
# 可以不写
{
"settings": {
"index":{
"number_of_shards":5,
"number_of_replicas":1
}
}
}
# number_of_shards  每个索引的主分片数默认值是5,配置后创建不能修改
# number_of_replicas 每个主分片的副本数,默认是1,可以修改

2. 查询索引

GET sy/_settings
# 返回结果
{
  "sy" : {
    "settings" : {
      "index" : {
        "creation_date" : "1588822389842",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "NBXIeVdHQ26vCuPn8_6uew",
        "version" : {
          "created" : "7050099"
        },
        "provided_name" : "sy"
      }
    }
  }
}

3. 更新索引

PUT sy/_settings
{
  "number_of_replicas": 2
}

4. 删除索引

DELETE sy

3. 文档基本增删改查

3.1 文档插入

# 新增一条文档
PUT test02/_doc/3  # 7.x后文档类型默认只有_doc。id 3可以不指定,es默认会生成一个uuid作为id
{
  "name":"李四",
  "age":"22",
  "dec":"合法公民",
  "tags":["交友","旅游","爱吃鸡"]
}
# python操作方式
from elasticsearch import Elasticsearch
#获取es连接
def get_es_engine(host,port,user=None,pwd=None):
    if user and pwd:
        es = Elasticsearch(host+':'+str(port), http_auth=(user, pwd), maxsize=15)  # 有XPACK安全认证的ES集群
    else:
        es = Elasticsearch(host+':'+str(port), maxsize=15)#无安全认证的集群
    return es
data_ins={
          "name" : "Rick.Wang",
          "company" : "CSDN",
          "age" : "10",
          "email" : "wangyikai@csdn.com"
        }
es.index(index='test02',body=data_ins,doc_type='_doc',id=8)  # 此处id可以不指定
es.indices.refresh(index="test02")  # es插入后不会立马查询到需要默认1s后从内存刷进文件系统中才能查到,此操作保证插入后立马刷入文件系统中,立马可以查询到

批量插入

#JSON数据不能有回车换行
batch_data= [
     {"index": {}},
     {"name": "王义凯", "age": 11, "email":"wangyikai1@csdn.com", "company":"CSDN1"},
     {"index": {}},
     {"name": "wang,yi-kai", "age": 22, "email":"wangyikai2@csdn.com", "company":"CSDN2"},
     {"index": {}},
     {"name": "Rick.Wang", "age": 33, "email":"wangyikai3@csdn.com", "company":"CSDN3"},
     {"index": {}},
     {"name": "义凯王", "age": 44, "email":"wangyikai4@csdn.com", "company":"CSDN4"},
 ]
es.bulk(index='test02',doc_type='_doc',body=batch_data)

3.2 删除文档

DELETE test02/_doc/3
es.delete(index='test02',doc_type='_doc',id=8)
# 批量删除
bd= {'query': {'bool': {'should': [{'match_phrase_prefix': {'email': 'yikai'}}]}}}
es.delete_by_query(index='test2',body=bd)

3.3 更新文档

覆盖式(原来的字段就没有了)(一般不用)

覆盖式(原来的字段就没有了)(一般不用)
PUT test02/_doc/3
{
  "name":"李四",
  "tags":["旅游","爱吃鸡"]
}

使用增量式

增量式(只修改某个字段)一定要注意包在doc中
POST test02/_doc/3/_update
{
  "doc":{
    "age": 30
  }
}
#指定ID进行更新单条记录
data={
    "doc":{
        "age":77
    }
}
es.update(index='test02',id=8,doc_type='_doc',body=data)
es.indices.refresh(index="test02")  # es插入或更新后不会立马查询到需要默认1s后从内存刷进文件系统中才能查到,此操作保证插入更新后立马刷入文件系统中,立马可以查询到

批量更新

POST /infomations/infomations/_update_by_query
JSON请求格式
{
    "query": {
        "match": {
            "status": "UP_SHELF"
        }
    },
    "script": {
        "inline": "ctx._source['status'] = 'DOWN_SHELF'"
    }
}
POST请求/索引/文档名/_update_by_query

主要看一下下面的script

ctx._source[字段名] = “值”;ctx._source[字段名] = “值”;
多个的话就用分号隔开。
data_all={
    "query": {
        "match_all": {}  
    }, 
    "script": {
      "source": "ctx._source.age = params.age;",
      "lang": "painless",
      "params" : {
          "age": "88"
      }
    }
}
es.update_by_query(index='test02',body=data_all)

3.4 查询文档

es默认只会返回一万条数据,由于ElasticSearch的默认 深度翻页 机制的限制造成的,ES为了避免用户的过大分页请求造成ES服务所在机器内存溢出,默认对深度分页的条数进行了限制,默认的最大条数是10000条

解决方案:增大1万条数量限制

# 对索引设置最大输出数
PUT /索引名/_settings
{"index": {"max_result_window" : 10000000}}
# 查询时使用 "track_total_hits": true 解除10000条限制
GET /索引名/_search
{
    "track_total_hits": true,
    "query":{
        "match_all":{
        }
    }
}

1、匹配查询

mach查询:有一个匹配都能查出来,查出来后他的得分_score不一样:1.匹配的词越多越高。2.当匹配的词相同时,该词在整个字段值中所站比例越高得分越高

GET test02/user/_search
{
  "query": {
    "match": {
      "name": "伤狂神"
    }
  }
}

精确查询:term/terms或者match查询中设置and

term查询主要用于精确值 匹配,这些精确值可能是数字、时间、布尔或者那些未分词(keyword)的字符串

POST test02/_doc/_search
{
    "query":{
        "term":{
            "age":20
        }
    }
}

terms查询跟 term 有点类似,但 terms 允许指定多个匹配条件。 某个字段可以指定了多个值

POST test02/_doc/_search
{
    "query":{
        "terms":{
            "age":[
                20,
                21
            ]
        }
    }
}

text类型使用match查询,使用and进行关联,不分词查询

GET test02/_search
{
  "query": {
      "match": {
        "name": {
          "query": "伤感王五",
          "operator": "and"
​
        }
      }
    } 
}

text类型使用keywords,不分词查询

GET test02/_search
{
  "query": {
      "match": {
        "name.keyword": "伤感王五"
      }
    } 
}

match 查询支持 minimum_should_match 最小匹配参数, 这让我们可以指定必须匹配的词项数用来表示一个文档是否相关。我们可以将其设置为某个具体数字,更常用的做法是将其设置为一个百分数,因为我们无法控制用户搜索时输入的单词数量:

GET test02/_search
{
  "query": {
      "match": {
        "name": {
          "query": "伤感DJ舞曲",
          "minimum_should_match": "70%"//匹配度
        }
      }
    } 
}
# 匹配算法:这里伤感DJ舞曲可划分为3个词,3*70% 约等于2。所以只要包含2个词条就算满足条件了。

2、过滤出只需要的字段输出

GET test02/user/_search
{
  "query": {
    "match": {
      "name": "学狂神"
    }
  },
  "_source": ["name"]
}

3、排序

GET test02/user/_search
{
  "query": {
    "match": {
      "name": "学狂神"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

4、分页查询

GET test02/user/_search
{
  "query": {
    "match": {
      "name": "学狂神"
    }
  },
  "from": 0,//从哪开始
  "size": 2//显示几条
}

5、bool查询

must:必须都满足,相当于and

GET test02/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "狂神"
          }
        },
        {
          "match": {
          "age":"21"
          } 
        }
      ]
    } 
  }
}

 

should:只需满足其一,相当于or

GET test02/user/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "狂神"
          }
        },
        {
          "match": {
          "age":"21"
          } 
        }
      ]
    } 
  }
}

must_not:必须都不满足,相当于not

GET test02/user/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "name": "狂神"
          }
        },
        {
          "match": {
          "age":"21"
          } 
        }
      ]
    } 
  }
}

6、结果过滤

GET test02/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "狂神"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gte": 10,
            "lte": 22
          }
        }  
      }
    } 
  }
}
{
"query": {
                "bool": {
                    "filter": [
                        {
                          "match": {"name": "狂神"}
                        },
                        {
                            "range": {
                                "age": {
                                    "gte": 18,
                                    "lte": 30
                                }
                            }
                        }
                    ]
                }
            }
}

7、模糊查询

fuzzy 查询是 term 查询的模糊等价。它允许用户搜索词条与实际词条的拼写出现偏差,但是偏差的编辑距离不得超过2

GET test01/_search
{
  "query": {
   "fuzzy": {
     "dec": {
       "value": "MAXDjSO",
       "fuzziness": 1
     }
   }
  } 
}

8、聚合查询

aggs可以使用分组group_by,最大值max,最小值min,平均值avg,求和sum,统计stats

AVG求平均值,最大值max,最小值min,平均值avg,求和sum,统计stats同样的使用方法

{
  "size": 0,
  "aggs": {
    "return_avg_balance": {   # return_avg_balance 返回的字段名,自定义
      "avg": {  # avg是求平均值
        "field": "balance"  # balance是对文档中具体某个字段名称求平均
      }
    }
  }
}

aggs结合分组查询

{
    "size": 0,  # 查询全部,但是不输出hits
    "query": {
        "match_all": {}
    },
    "aggs": {  # 输出aggregations
        "group_technics_name": {  # 自定义分组后的名称
            "terms": {
                "field": "technics_name"  # 根据technics_name分组
                }
         }
    }
}

top_hits:根据query在聚合的基础上返回最相关的n个匹配结果,配置项,size(返回多少条,默认3条),from(偏移),sort(排序,默认根据score)

aggs结合分组查询,并通过top_hits输出每个组下相关的结果

{
    "size": 0,  # 查询全部,但是不输出hits
    "query": {
        "match_all": {}
    },
    "aggs": {  # 输出aggregations
        "group_technics_name": {  # 自定义分组后的名称
            "terms": {
                "field": "technics_name",  # 根据technics_name分组
            },
            "aggs": {
                "top_technics_name": {   # 自定义输出时的名字
                    "top_hits": {  # 分组聚合后返回多少个相关的值,使用top_hits
                        "size": 1000
                    }
                }
            }
        }
    }
}

 

 

 

posted @ 2020-05-07 22:11  Mr沈  阅读(779)  评论(0编辑  收藏  举报