ElasticSearch的API, DSL查询语句

ElasticSearch的API, DSL查询语句

文章目录

  • ElasticSearch的API, DSL查询语句
  • 一、保存数据
    • 1.新增数据
    • 2.更新操作
    • 3.更新的同时增加属性
    • 4.批量操作
  • 二、查询数据
    • 1.查询DSL
    • 2.返回部分字段
    • 3.match精确匹配查询
    • 4.字符串,多个单词(分词+全文检索):
    • 5.将需要匹配的值当成一个整体单词(不分词)进行检索
    • 6.multi_match【多字段匹配】state或者address包含mill
    • 7.bool复合查询: 查出address是 MILL且是男性的
    • 8.should:应该达到should列举的条件,如果达到会增加相关文档的评分,并不会改变 查询的结果
    • 9.filter【结果过滤】:过滤出balance在18000~20000之间
    • 10. 全文检索字段用 match,其他非 text 字段匹配用 term
  • 三、aggregations(聚合)
      • (最简单的聚合方法大致等于SQL GROUP BY 和 SQL 聚合函数)
    • 1. 先查出address中包含mill的, 在聚合分析出年龄分布, 以及年龄的平均值, size:0表示只显示聚合结果ageAgg表示这次聚合的名字, terms是聚合的类型
    • 2. 先按照年龄聚合, 再计算每个年龄段的人的平均薪资
    • 3. 查出所有年龄分布,以及这些年龄段中男性的平均薪资和女性的平均薪资以及这个年龄 段的总体平均薪资
  • 四、Mapping 是用来定义一个文档(document),以及它所#包含的属性(field)是如何存储和 索引的
    • 1. 创建索引并指定映射
    • 2. 添加新的字段映射
    • 3. 更新映射(对于已经存在的映射字段,我们不能更新。更新必须创建新的索引进行数据迁移)


一、保存数据

1.新增数据

#增加数据: 
POST users/_doc
{
  "name":"redis",
  "age":29,
  "sex": "男"
}

#带主键, 如果主键不存在,则插入;反之,则更新
POST users/_doc/1
{
  "name": "张三",
  "age": 20,
  "sex": "男"
}

2.更新操作

POST users/_doc/1
{
  "name": "John Doe2"
}

POST users/_update/1
{
  "doc": {
    "name": "张益达"
  }
}

PUT users/_doc/1
{
  "name": "张大炮"
}

3.更新的同时增加属性

POST users/_update/1
{
  "doc": {
    "name": "Jane Doe",
    "city": "北京",
    "age": 20
  }
}

4.批量操作

POST users/_doc/_bulk
{"index":{"_id":"1"}}
{"name":"John Doe"}
{"index":{"_id":"2"}}
{"name":"Jane Doe"}

二、查询数据

1.查询DSL

GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0, 
  "size": 3, 
  "sort": [
    {
      "account_number": {
        "order": "asc"
      }
    }
  ]
}

2.返回部分字段

GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["age", "balance", "firstname"]
}

3.match精确匹配查询

GET bank/_search
{
  "query": {
    "match": {
      "account_number": "20"
    }
  }
}

4.字符串,多个单词(分词+全文检索):

GET bank/_search
{
  "query": {
    "match": {
      "address": "mill road"
    }
  }
}

5.将需要匹配的值当成一个整体单词(不分词)进行检索

GET bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill road"
    }
  }
}

6.multi_match【多字段匹配】state或者address包含mill

GET bank/_search
{
  "query": {
    "multi_match": {
      "query": "625",
      "fields": [
        "account_number", 
        "address"
      ]
    }
  }
}

7.bool复合查询: 查出address是 MILL且是男性的

GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "address": "MILL"
          }
        },
        {
          "match": {
            "gender": "M"
          }
        }
      ]
    }
  }
}

8.should:应该达到should列举的条件,如果达到会增加相关文档的评分,并不会改变 查询的结果

GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "address": "MILL"
          }
        },
        {
          "match": {
            "gender": "M"
          }
        }
      ],
      "should": [
        {
          "match": {
            "address": "lane"
          }
        }
      ]
    }
  }
}

9.filter【结果过滤】:过滤出balance在18000~20000之间

GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "address": "Street"
          }
        }
      ],
      "filter": {
        "range": {
          "balance": {
            "gte": 18000,
            "lte": 20000
          }
        }
      }
    }
  },
  "from": 0,
  "size": 50
}

10. 全文检索字段用 match,其他非 text 字段匹配用 term

GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "age": {
              "value": "28"
            }
          }
        },
        {
          "match": {
            "address": "990"
          }
        }
      ]
    }
  }
}

三、aggregations(聚合)

(最简单的聚合方法大致等于SQL GROUP BY 和 SQL 聚合函数)

1. 先查出address中包含mill的, 在聚合分析出年龄分布, 以及年龄的平均值, size:0表示只显示聚合结果ageAgg表示这次聚合的名字, terms是聚合的类型

GET bank/_search
{
  "query": {
    "match": {
      "address": "mill"
    }
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 10
      }
    },
    "avg_agg": {
      "avg": {
        "field": "age"
      }
    }
  },
  "size": 0
}

2. 先按照年龄聚合, 再计算每个年龄段的人的平均薪资

GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 1000,
        "order": {
          "_key": "asc"
        }
      },
      "aggs": {
        "balanceAgg": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

3. 查出所有年龄分布,以及这些年龄段中男性的平均薪资和女性的平均薪资以及这个年龄 段的总体平均薪资

GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 100,
        "order": {
          "_key": "asc"
        }
      },
      "aggs": {
        "genderAgg": {
          "terms": {
            "field": "gender.keyword",
            "size": 100
          },
          "aggs": {
            "balanceAvg": {
              "avg": {
                "field": "balance"
              }
            }
          }
        },
        "balanceAvg": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

四、Mapping 是用来定义一个文档(document),以及它所#包含的属性(field)是如何存储和 索引的

1. 创建索引并指定映射

GET my_index/_mapping

PUT my_index
{
  "mappings": {
    "properties": {
      "age": {
        "type": "integer"
      },
      "email": {
        "type": "keyword"
      },
      "name": {
        "type": "text"
      }
    }
  }
}

2. 添加新的字段映射

PUT my_index/_mapping
{
  "properties": {
    "employee-id": {
      "type": "keyword",
      "index": false
    }
  }
}

3. 更新映射(对于已经存在的映射字段,我们不能更新。更新必须创建新的索引进行数据迁移)

#source源索引数据, dest目标索引
POST _reindex
{
  "source": {
    "index": "users"
  },
  "dest": {
    "index": "userman"
  }
}

你可能感兴趣的:(elasticsearch,java)