elasticsearch 建立索引、增删改查 及简单查询和组合查询的学习笔记

创建一个索引(数据库)

PUT lagou  # 索引名称
{
  "settings": {
    "index":{
      "number_of_shards":5,    # 分片数量(不可变更的)
      "number_of_replicas":1   # 副本数量
    }
  }
}

获取指定的索引信息

GET lagou/_settings           # 获取lagou索引库的设置信息
GET _all/_settings            # 获取所有索引库的设置信息
GET .kibana,lagou/_settings   # 获取kibana和lagou指定索引库的设置信息
GET _settings                 # 等效于GET _all/_settings 


# 也可以直接GET索引获取信息
GET lagou


# 获取指定ID的所有索引信息
GET lagou/job/2

# 指定获取某个字段的索引信息(获取到ID为1的title和publish_date信息)
GET lagou/job/1?_source=title,publish_date

更新索引信息

PUT lagou/_settings
{
  "number_of_replicas": 2   # 修改lagou的副本数量为2
}

保存文档到索引库当中

# 保存文档

PUT lagou/job/1
{
  "title":"python java 大数据挖掘工程师",
  "salary_min":25000,
  "city":"北京",
  "company":{
    "name":"百度",
    "company_addr":"北京软件园"
  },
  "publish_date":"2017-4-16",
  "comments":15
}



PUT lagou/job/2
{
  "title":"python django 爬虫开发工程师",
  "salary_min":15000,
  "city":"北京",
  "company":{
    "name":"百度",
    "company_addr":"北京软件园"
  },
  "publish_date":"2017-4-16",
  "comments":15
}






# 不指名ID值时必须使用POST命令
POST lagou/job/
{
  "title":"python django 开发工程师",
  "salary_min":30000,
  "city":"上海",
  "company":{
    "name":"美团科技",
    "company_addr":"北京市软件园A区"
  },
  "publish_date":"2017-4-16",
  "comments":20
}

_指数

扫描二维码关注公众号,回复: 5628796 查看本文章

_类型

_ID

_得分了

标题

salary_min

公司名

company.company_addr

出版日期

评论

拉钩

工作

2

1

python django爬虫开发工程师

15000

北京

百度

北京软件园

2017年4月16日

15

拉钩

工作

1

1

python java大数据挖掘工程师

25000

北京

百度

北京软件园

2017年4月16日

15

拉钩

工作

AWhUyE6T4nXYmxBzQQAy

1

python django开发工程师

30000

上海

美团科技

北京市软件园甲区

2017年4月16日

20

修改文档数据和字段值

# 修改删除了ID为1的company_addr字段(覆盖式修改)
PUT lagou/job/1
{
  "title":"python java 大数据挖掘工程师",
  "salary_min":25000,
  "city":"北京",
  "company":{
    "name":"百度"
  },
  "publish_date":"2017-4-16",
  "comments":15
}

# 指定修改ID为1的字段comments的值为30(指定式修改)
# 方法POST 关键字_update
POST lagou/job/1/_update
{
  "doc":{
    "comments":30
  }
}

删除指定索引数据和删除索引库

# 删除
DELETE lagou/job/1     # 删除ID为1的索引数据
DELETE lagou           # 删除索引为lagou的所有

一次性批量获取查询多条索引数据

# 已经建立了一个名称为:testdb的索引库和job1、job2的表及一个title的字段
# _index的指向数据库和表也可为其他,实现同时查询多个条件(可应用于类似Mysql的关系表查询)

# 可不同的索引库查询
GET _mget
{
  "docs":[
    {
      "_index":"testdb",
      "_type":"job1",
      "_id":1
    },
    {
      "_index":"testdb",
      "_type":"job2",
      "_id":2
    }
    ]
}


# 指向同一个索引库查询
GET testdb/_mget
{
  "docs":[
    {
      "_type":"job1",
      "_id":1
    },
    {
      "_type":"job2",
      "_id":1
    }
    ]
}



# 指向同一索引库和同一表的数据查询
GET testdb/job1/_mget
{
  "docs":[
    {
      "_id":1
    },
    {
      "_id":2
    }
    ]
}
# 或者更简便的方法(列表形式)查询同一索引库和同一表
GET testdb/job1/_mget
{
  "ids":[1,2]
}





# 获取到的数据如下:
{
  "docs": [
    {
      "_index": "testdb",
      "_type": "job1",
      "_id": "1",
      "_version": 3,
      "found": true,
      "_source": {
        "title": "job1_1"
      }
    },
    {
      "_index": "testdb",
      "_type": "job2",
      "_id": "2",
      "_version": 1,
      "found": true,
      "_source": {
        "title": "job2_2"
      }
    }
  ]
}

操作散装批量
请|立即iTunes的电子杂志类型:索引(索引),删除(删除),更新(更新),创建(创建
也可以从一个索引导入到另外

# bulk批量操作 如果索引库中没有test索引库时,bulk会自动创建一个名称为test的索引库及job的表
POST _bulk
{"index":{"_index":"test","_type":"job","_id":"3"}}
{"title":"PHP底层构架工程师","salary_min":20000,"city":"北京","company":{"name":"百度","company_addr":"北京市软件科技园D区5栋"},"publish_date":"2017-08-16","comments":20}
{"index":{"_index":"test","_type":"job","_id":"4"}}
{"title":"C++界面开发工程师","salary_min":25000,"city":"广州","company":{"name":"百度","company_addr":"北京市软件科技园D区5栋"},"publish_date":"2017-10-14","comments":10}
{"index":{"_index":"test","_type":"job","_id":"5"}}
{"title":"AI网站美工设计工程师","salary_min":15000,"city":"杭州","company":{"name":"阿里巴巴","company_addr":"杭州高新科技园阿里巴巴园区"},"publish_date":"2017-11-25","comments":10}



# 索引数据增量操作(ID 1、2、3...)
{"index":{"_index":"sssdb","_type":"tttt","_id":"1"}}
{"字段名":"字段值"}
{"index":{"_index":"sssdb","_type":"tttt","_id":"2"}}
{"字段名":"字段值2"}
{"index":{"_index":"sssdb","_type":"tttt","_id":"3"}}
{"字段名":"字段值3"}
....



# 索引数据批量删除(ID 1、2、3...)
{"delete":{"_index":"sssdb","_type":"tttt","_id":"1"}}
{"delete":{"_index":"sssdb","_type":"tttt","_id":"2"}}
{"delete":{"_index":"sssdb","_type":"tttt","_id":"3"}}
.....


# 索引数据批量创建(ID 1、2、3...)
{"create":{"_index":"sssdb","_type":"tttt","_id":"1"}}
{"字段名":"字段值1"}
{"create":{"_index":"sssdb","_type":"tttt","_id":"2"}}
{"字段名":"字段值2"}
{"create":{"_index":"sssdb","_type":"tttt","_id":"3"}}
{"字段名":"字段值3"}
....


# 索引数据批量更新(ID1、2、3...)
{"update":{"_id":"1","_type":"tttt","_index":"sssdb"}}
{"doc":{"字段名":"字段值1"}}
{"update":{"_id":"2","_type":"tttt","_index":"sssdb"}}
{"doc":{"字段名":"字段值2"}}
{"update":{"_id":"3","_type":"tttt","_index":"sssdb"}}
{"doc":{"字段名":"字段值3"}}
....

映射(映射)

定义数据字段的类型及相关属性,是否如可以参与搜索等
内置的类型
字符串类型:文本(分词分析),关键字(原样返回)(字符串类型在ES5开始已经废弃,也就是只匹配文本和关键词参与搜索)
数字类型:长(长整数),整数(整数),短(短整数),字节(字节),双(浮点数),浮子(浮点数)
日期类型:日期(包括时,分,秒)
布尔类型:布尔(布尔类型)
二进制类型:二进制(二进制)
复杂类型:对象(嵌套字典等),嵌套()
地理类型:地理点(经纬度标记),地理形状(多点标记)
专业类型:IP,赛区(搜索建议)

自定义索引的映射

# 自定义创建索引的映射
# 索引库名称:alibaba、表:job、字段:title、类型:text(根据需要填写)
# 嵌套的字典:company、嵌套的字段:name、类型:text


# 自定义创建索引的映射
PUT alibaba
{
  "mappings":{
    "job":{
      "properties":{
        "title":{
          "type":"text"
        },
        "company"{
          "properties":{
            "name":{
              "type":"text"
            }
          }
        }
      }
    }
  }
}



# 完整的创建一次索引库
# 自定义创建索引的映射
PUT alibaba
{
  "mappings":{
    "job":{
      "properties":{
        "title":{
          "type":"text"
        },
        "salary_min":{
          "type":"integer"
        },
        "city":{
          "type":"keyword"
        },
        "company":{
          "properties":{
            "name":{
              "type":"text"
            },
            "company_addr":{
              "type":"text"
            },
            "employee_count":{
              "type":"integer"
            }
          }
        },
        "publish_date":{
          "type":"date",
          "format":"yyyy-mm-dd"
        },
        "comments":{
          "type":"integer"
        }
      }
    }
  }
}


# 数据存档
PUT alibaba/job/1
{
  "title":"阿里巴巴销售代表成长快+双休福利好",
  "salary_min":20000,
  "company":{
    "name":"阿里巴巴",
    "company_addr":"企石镇东平村145号",
    "employee_count":35
  },
  "publish_date":"2019-1-12",
  "comments":20
}


# 查看定义的数据类型映射
GET alibaba/_mapping/job


索引数据查询分类:
    基本查询:使用ES内置查询查询条件
    组合查询:把多个查询组合在一起进行复合查询
    过滤:查询同时,通过过滤条件在不影响打分的

bool格式如下:
bool:{
 “filter”:[],(指定字段)
“must”:[],(数组所有都要满足)
“should”:[],(只要满足一个或多个都可以)
“ must_not“:{},(与必须相反,数组里一个都不满足时)
}

# 添加映射
PUT keycha
{
  "mappings":{
    "job":{
      "properties": {
        "title":{
          "store": true,
          "type":"text",
          "analyzer": "ik_max_word"
        },
        "company_name":{
          "store":true,
          "type":"keyword"
        },
        "desc":{
          "type":"text"
        },
        "comments":{
          "type":"integer"
        },
        "add_time":{
          "type":"date",
          "format":"yyy-mm-dd"
        }
      }
    }
  }
}

# 插入数据
POST keycha/job
{
  "title":"python django 开发工程师",
  "company_name":"美团科技有限公司",
  "desc":"对django的概念熟悉,熟悉python基本知识",
  "comments":20,
  "add_time":"2017-4-1"
}

POST keycha/job
{
  "title":"python scrapy redis分布式爬虫基本",
  "company_name":"百度科技有限公司",
  "desc":"对scrapy的概念熟悉,熟悉redis基本知识",
  "comments":5,
  "add_time":"2017-4-15"
}

POST keycha/job
{
  "title":"elasticsearch打造搜索引擎",
  "company_name":"阿里巴巴科技有限公司",
  "desc":"熟悉数据结构算法,熟悉python的基本开发",
  "comments":15,
  "add_time":"2017-6-20"
}

POST keycha/job
{
  "title":"python打造推荐搜索引擎系统",
  "company_name":"阿里巴巴科技有限公司",
  "desc":"熟悉推荐引擎的原理及算法,掌握C语言",
  "comments":60,
  "add_time":"2016-10-20"
}



# match查询
# match查询会将字母都转换为小写和对词组进行分词进行查询
GET keycha/job/_search
{
  "query":{
    "match":{
      "title":"爬取"
    }
  }
}


# term查询
# 查询值不做任何处理,直接查询(全量查询,不分词和转换小写)
GET keycha/_search
{
  "query":{
    "term":{
      "title":"python"
    }
  }
}


# terms查询
# 转换和分词后列表中只要有一个词匹配就会返回结果
GET keycha/_search
{
  "query":{
    "terms":{
      "title":["工程师","Django","系统"]
    }
  }
}


# 控制查询的返回数量
# from为起始数,size为获取数量(如果从1开始就会舍弃第0条数据)
GET keycha/_search
{
  "query":{
    "match":{
      "title":"python"
    }
  },
  "from":1,
  "size":3
}


# match_all查询
# 获取keycha的job内的所有数据
GET keycha/_search
{
  "query":{
    "match_all": {}
  }
}


# match_phrase短语查询
# 必须满足词条的所有词才会返回结果
# slop为词条之间的最小单位距离,如果距离小于就不返回
GET keycha/_search
{
  "query": {
    "match_phrase": {
      "title":{
        "query":"python系统",
        "slop":9
      }
    }
  }
}


# multi_match查询
# 比如可以指定多个字段
# 比如查询title和desc这两个字段里面包含python的关键词文档
# title^3表示title的权重是desc的3倍
GET keycha/_search
{
  "query":{
    "multi_match":{
      "query":"python",
      "fields":["title^3","desc"]
    }
  }
}


# 指定返回字段
# 列表中指定了desc但是没有返回结果,因为在创建映射时store默认是Flaes的,只有设置store为True时才会返回到数据
GET keycha/_search
{
  "stored_fields": ["title","company_name","desc"],
  "query": {
    "match":{
      "title":"python"
    }
  }
}


# 通过sort把结果排序
# match_all把所有文档查询出来,然后sort排序comments字段的值(desc是降序排序方法,还有asc是升序排序方法)
GET keycha/_search
{
  "query": {
    "match_all": {}
  },
  "sort":[{
    "comments":{
      "order":"desc"
    }
  }]
}



# range范围查询方法
# gte:大于等于、gt:大于、lte:小于等于、lt:小于 
# boost 为权重
GET keycha/_search
{
  "query": {
    "range":{
      "comments":{
        "gte":10,
        "lte":60,
        "boost":2.0
      }
    }
  }
}

# range日期范围查询方法
# get大于等于2017-04-01
# lte小于等于当前日期
GET keycha/_search
{
  "query": {
    "range":{
      "add_time":{
        "gte":"2017-04-01",
        "lte":"now"
      }
    }
  }
}



# wildcard模糊查询
# 支持*号通配符进行查询的方法(不支持中文)
GET keycha/_search
{
  "query": {
    "wildcard":{
      "title":{
        "value": "py*n",
        "boost": 2
      }
    }
  }
}

复合组合查询的多种方法

# 建立测试数据
POST testdb/job/_bulk
{"index":{"_id":1}}
{"salary":10,"title":"Python"}
{"index":{"_id":2}}
{"salary":20,"title":"Scrapy"}
{"index":{"_id":3}}
{"salary":30,"title":"Django"}
{"index":{"_id":4}}
{"salary":30,"title":"Elasticsearch"}


# bool格式如下:
#bool:{
# "filter":[], (字段过滤)
# "must":[],    (数组所有都要满足)
# "should":[],   (只要满足一个或多个都可以)
# "must_not":{},  (与must相反,数组里一个都不满足时)
#}

# 简单的过滤查询
# 最简单的filter查询
# 薪资为20k的工作
# 先设定bool>must>match_all获取所有数据>filter指定字段>term指定查询
GET testdb/job/_search
{
  "query":{
    "bool": {
      "must": {
        "match_all":{}
      },
      "filter": {
        "term": {
         "salary":20
        }
      }
    }
  }
}

# 指定查询多个值用terms进行列表多值查询
GET testdb/job/_search
{
  "query":{
    "bool": {
      "must": {
        "match_all":{}
      },
      "filter": {
        "terms": {
         "salary":[10,20]
        }
      }
    }
  }
}



# 查看分析器解析的结果
# ik_max_word会将单个字也分为一个词
GET /_analyze
{
  "analyzer":"ik_max_word",
  "text":"python网络工程师系统开发的"
}

# 查看分析器解析的结果
# ik_smart以最小数据集进行分词(连词)
GET /_analyze
{
  "analyzer":"ik_smart",
  "text":"python网络工程师系统开发的"
}


# 查询salary等于20或title等于python 且 salary不等于30
GET testdb/job/_search
{
  "query": {
    "bool": {
      "should": [
        {"term":{"salary":20}},
        {"term":{"title":"python"}}
      ],
      "must_not": {
        "term":{"salary":30}
      }
    }
  }
}

# 查询title等于"python"或(title等于elasticsearch 且 salary等于30)
# 嵌套查询是从内往外计算条件的
GET testdb/job/_search
{
  "query": {
    "bool": {
      "should": [
        {"term": {"title":"python"}},
        {"bool":{
          "must":[
            {"term":{"title":"elasticsearch"}},
            {"term":{"salary":30}}
            ]
        }
        }
      ]
    }
  }
}


# 指点两个字段值查询
GET xiangguang/_search
{
  "query":{
    "bool":{
      "must":[
        {"match_phrase":{"soci":{"query":"海绵"}}},
        {"term":{"s_type":"sell"}}
        ]
    }
  }
}

处理无效的数据和取反的方法

# 过滤空和非空数据

# 建立测试数据到testdb的job2当中
POST testdb/job2/_bulk
{"index":{"_id":"1"}}
{"tags":["search"]}
{"index":{"_id":"2"}}
{"tags":["search","python"]}
{"index":{"_id":"3"}}
{"tags":["some data"]}
{"index":{"_id":"4"}}
{"tags":null}
{"index":{"_id":"5"}}
{"tags":["search",null]}

# 处理为null的方法
# 查询的tags不包含null的数据
GET testdb/job2/_search
{
  "query": {
    "bool":{
      "filter":{
        "exists":{
          "field":"tags"
        }
      }
    }
  }
}


# 查询tags为null的数据
# 利用must_not取反的方法来取null的数据
GET testdb/job2/_search
{
  "query":{
    "bool":{
      "must_not": {
        "exists":{
          "field":"tags"
        }
      }
    }
  }
}

猜你喜欢

转载自blog.csdn.net/qq_40134903/article/details/86504577
今日推荐