栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

ElasticSearch文档操作

ElasticSearch文档操作

操作文档document(类似于数据库DML)

文档操作可在ES官方的DSL文档查看添加文档删除文档修改文档查询文档 添加文档

#创建索引
PUT person   ##不添加映射时,在添加数据也就是添加文档时有隐式映射。
# 查询索引
GET person

# 添加文档,指定id
PUT person/_doc/1     ##如果此为此ID的文档已存在则修改文档
{
  "name":"张三",
  "age":20,
  "address":"深圳宝安区"
} 
# 添加文档,不指定id会报错。。POST不会报错。
PUT person/_doc/
{
  "name":"李四",
  "age":20,
  "address":"深圳南山区"
}

添加文档还可以用POST请求(新增数据一般POST)

# 添加文档,指定id

POST person/_doc/1 //如果此为此ID的文档已存在则修改文档
{
  "name":"张三",
  "age":20,
  "address":"深圳宝安区"
} 

# 添加文档,不指定id

POST person/_doc/
{
  "name":"李四",
  "age":20,
  "address":"深圳南山区"
}
删除文档
DELETe person/_doc/ID  ##ID位置填文档的ID号,并且是逻辑删除,将状态改为了删除。并没有从磁盘中删除,会等整理ES时在删除。
查询文档
# 查询所有文档
GET person/_search
# 查询文档
GET person/_doc/ID ##ID处为文档的ID

查询操作(常用查询) 全文查询-match查询

​ 全文查询会分析查询条件,先将查询条件进行分词,然后获取文档,将文档按照定义时的分词器进行分词。然后和查询条件分词结果相匹配。

这是Person索引库中有的数据。

执行全文查询-match查询

GET person/_search
{
  "query":{
    "match":{
      "address":{	//要查询的字段,address字段
        "query": "南山区", //字段内容
        "analyzer": "ik_max_word" //使用哪个分词器。
      }
    }
  }
}

IK分词器会将查询条件内容分词,分成下面的内容

因为我们定义字段时使用的是默认的分词器,是standard,所以获取文档,对文档分词是一个个的

所以没有匹配到的内容。

如果将ik_max_word改为standard就能查询到结果。

词条查询-term查询

词条查询不会将查询条件进行分词,避免对text类型的字段使用term查询,text字段会进行分词。

GET person/_search
{
  "query": {
        "term": { //使用词条查询
            "addres": { //查询字段
                "value": "山区", //查询的值
                "boost": 1.0 //相关系数
            }
        }
    }
}

命中数为0,因为文档内容进行分词时默认分词是一个字一个字的,没有和 ”山区“ 匹配的词。

因为文档内容默认分词是一个字一个字的,当查询条件的词条为一个字时,就能查询出结果。

GET person/_search
{
  "query": {
        "term": {
            "address": {
                "value": "山",
                "boost": 1.0
            }
        }
    }
}

范围查询

为了实现操作我们新建一个索引库。添加一些数据

PUT zwh/_doc/1001
{
  "name":"zwh1",
  "sex":"女",
  "age":21
}
PUT zwh/_doc/1002
{
  "name":"zwh2",
  "sex":"男",
  "age":22
}
PUT zwh/_doc/1003
{
  "name":"zwh3",
  "sex":"女",
  "age":23
}
PUT zwh/_doc/1004
{
  "name":"zwh4",
  "sex":"男",
  "age":24
}

进行范围查询

GET zwh/_search
{
  "query":{
    "range":{ //范围查询
      "age":{    //age字段
        "lt": 22, //小于22   可选参数有 gt大于  lt小于   gte大于等于    lte小于等于 
        "gt": 16  //大于16 
      }
    }
  }
}
复杂查询-------Boolean查询

它是使用一个或多个布尔子句构建的,每个子句都有一个类型化的实例。具体类型包括:

**_score:**查询出的内容的评分,根据评分大小排名。

GET zwh/_search
{
  "query":{
    "bool":{
      "must": [  //所包括的条件必须匹配,会增加_score,must是一个数组,可以包括多个条件用逗号隔开
        {
          "match":{   //match查询
          "name":"zwh1" 
          }
        },
        {
          "range": {//范围查询
          "age": {
            "gt": 20
          }
        }
        }
      ],
     "filter":[  //所包括的条件必须匹配,但是不会增加_score,filter也是一个数组,可以包括多个条件用逗号隔开
        {
          "match":{
            "sex":"女"
          }
        }
      ]
    }
  }
}

使用Filter之前

使用Filter之后

通过上面两张图可以发现,_score并没有增加

高亮查询

什么是高亮查询?

就是我们搜索数据后,红色高亮的那一部分就是高亮搜索后的结果。

GET zwh/_search
{
  "query":{
    "bool":{
      "must": [
        {
          "match":{
          "name":"zwh1"
          }
        },
        {
          "range": {
          "age": {
            "gt": 20
          }
        }
        }
      ],
       "filter":[
        {
          "match":{
            "sex":"男"
          }
        }
        ]
    }
  },
  "highlight": {
    "fields": {"name":{}
    }
  }
}

当执行该查询时,返回结果与之前一样,与此同时结果中还多了一个叫做 highlight 的部分。这个部分包含了 about 属性匹配的文本片段,并以 HTML 标签 封装:

Exists查询

返回在提供的字段中包含 null 或 [] 以外的值的文档。

先添加一个name字段为空的文档

POST zwh/_doc/1009
{
  "sex":"女",
  "age":33
}

查询zwh索引库,发现总的数据为7条。

GET zwh/_search

使用Exists查询,查找zwh索引库name字段为非空的文档。发现总数只有6条了,显然刚才添加的那条name字段为空的数据并没有被查出来。

GET zwh/_search
{
  "query":{
    "exists":{
      "field": "name"
    }
  }
}

Exists查询 查找空值

​ 查找字段值为null或者【】的值 需要与 复杂查询中的 boolean查询配合使用

GET zwh/_search
{
  "query": {
    "bool": {
      "must_not": [ //这个表示下方匹配到的内容不得出现在获得的文档对象中,上方复杂查询有讲过。
        {
          "exists": {
            "field": "name"
          }
        }
      ]
    }
  }
}

执行查询,总数只有一条,name没有值的文档。

指定查询响应字段
GET zwh/_search
{
  "query":{
    "range": {
      "age":{
        "lt":28,
        "gt":23
      } 
    }
  }
  , "_source": ["name","age"]
}

判断文档是否存在

​ 存在返回200 ok

HEAD zwh/_doc/1001

​ 不存在返回404 not found

HEAD zwh/_doc/1012

分页查询
GET zwh/_search?from=0&size=1

from:代表越过这个文档,从这个文档的下一个文档开始。(可以理解为如果from=0,就从第一条开始显示,为2,就从第三条开始显示。默认from为0)

size:代表每次显示的条数。

执行查询,总文档有7条,只显示了一条。

Terms查询

和上面的term相似,只不过可以有多个匹配条件。

GET zwh/_search
{
  "query": {
    "terms":{
      "age":[23,21,36] //age字段的值满足其中之一就可以被查询出来
    }
  }
}

批量操作

通过批量 API,可以在单个 API 调用中执行许多索引/删除操作。这可以大大提高索引速度。

批量新增
//{"要进行的操作":{"固定的值_index":"要对哪个索引库进行此操作",“固定值_id”:"添加文档内容的ID(若不指定会自动分配)"}}
//{“字段名”:"值" }(可以有多个,用逗号隔开)。
POST _bulk
{"create":{"_index":"zwh","_id":57}}
{"name":"拉布拉多1","sex":"dog","age":1}
{"create":{"_index":"zwh","_id":58}}
{"name":"拉布拉多2","sex":"dog","age":2}
{"create":{"_index":"zwh","_id":59}}
{"name":"拉布拉多3","sex":"dog","age":3}

执行操作

批量删除
//{“要执行的操作名”:{“_index”:“要删除文档所属索引库的名字”,"_id":“文档的ID"}}
POST _bulk
{"delete":{"_index":"zwh","_id":57}}
{"delete":{"_index":"zwh","_id":58}}
{"delete":{"_index":"zwh","_id":59}}

执行删除

批量修改
//{”操作名“:{”_index":"要修改文档所在的索引库","_id":"文档ID"}
//{"doc":{"字段":”值“}} (doc里面可以有多个字段和值,用逗号隔开)  
POST _bulk
{"update":{"_index":"zwh","_id":58}}
{"doc":{"name":"123"}}
{"update":{"_index":"zwh","_id":59}}
{"doc":{"name":"1234"}}
{"update":{"_index":"zwh","_id":57}}
{"doc":{"name":"1235"}}

执行修改

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/736343.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号