一、curd基本操作(原生api)

1、查询出所有索引

类似于sql的查询节点信息
GET _cat/indices

2、创建索引,指定mapping(映射关系)

类似于sql的创建表,指定表字段的各种属性
PUT bank
{
  "mappings": {
    "properties": {
      "id":{"type": "integer"},
      "en_name":{"type": "keyword"},
      "zn_name":{"type": "text"},
      "creat_time":{"type": "date"},
      "state_owned":{"type": "boolean"},
      "address":{"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},
      "employees":{"type": "integer_range"}
    }
  }
}

3、往索引添加数据

PUT /bank/_doc/1
{
  "id":1,
  "en_name": "msbk",
  "zn_name": "民生银行",
  "creat_time": "1996-06-01",
  "state_owned": false,
  "address": "北京市朝阳区东四桥88号",
  "employees" : { 
    "gte" : 10,
    "lte" : 20
  }
}

4、修改文档数据

POST /bank/_update/1
{
  "doc": {
    "creat_time": "1996-06-02"
  }
}

5、删除索引

DELETE /bank1

6、批量导入

curl -u elastic -H "Content-Type: application/json"  -XPOST "47.98.251.75:9200/shakespeare/_bulk" --data-binary @shakespeare.json

7、查询语法

(1)、match分词匹配
如果字段是text类型,就会进行分词匹配。
如果字段是keyword类型,也不会进行分词匹配。

GET /shakespeare/_search
{
  "query": {
    "match": {
      "play_name": "Henry IV"
    }
  }
}

(2)、trem不分词匹配

不管字段是什么类型,都不进行分词匹配,直接那整个词去找索引库
GET /shakespeare/_search
{
  "query": {
    "term": {
      "text_entry": "LORD"
    }
  }
}

(3)、全部查询

GET /shakespeare/_search
{
  "query": {
    "match_all": {}
  }
}

(4)、布尔值查询

must代表and
should代表or
must_not代表not
GET /shakespeare/_search
{
  "query": {
    "bool": {
      "should": [
        {"match": {"line_id": 1}},
        {"match": {"text_entry": "ACT I"}}
      ]
    }
  }
}

(5)、fifter

fifter是直接筛选,不计算分数
GET /shakespeare/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "line_id": 9523
          }
        }
      ]
    }
  }
}

(6)、字段聚合查询

类似于sql的聚合函数
默认对 text 类型的字段(field)禁用了 fielddata;text 类型的字段在创建索引时会进行分词处理, 
而聚合操作必须基于字段的原始值进行分析;所以如果要对 text 类型的字段进行聚合操作, 
就需要存储其原始值 —— 创建mapping时指定fielddata=true, 
以便通过反转倒排索引(即正排索引)将索引数据加载至内存中。

也可以text的内置字段keyword作精确查询、聚合分析
(推荐,开启fielddata字段后, 聚合分析操作会对这个字段的所有分词分别进行聚合, 获得的结果大多数情况下并不符合需求)
顺序是先分组, 再统计, 最后排序
GET book_shop/it_book/_search
{
    "size": 0,
    "aggs": {
        "all_tags": {
            "terms": {
                "field": "tags.keyword", 
                "order": { "avg_price": "desc" } // 根据下述统计的结果排序
            },
            "aggs": {
                "avg_price": {
                    "avg": { "field": "price" }
                }
            }
        }
    }
}

GET /shakespeare/_search
{
  "size": 0,
  "aggs": {
    "stats_lineid": {
      "stats": {
        "field": "line_id"
      }
    }
  }
}

(7)、桶聚合

类似于sql的分组

GET /shakespeare/_search
{
  "size": 0, 
  "query": {
    "match_all": {}
  },
  "aggs": {
    "speechNumber": {
      "terms": {
        "field": "speech_number"
      },
      "aggs": {
        "lineidsum": {
          "sum": {
            "field": "line_id"
          }
        }
      }
    }
  }
}

8、查询原理

(1)、查询分为两种,一种是叶子查询,也就是对特定的字段进行筛选.第二种是复合查询,也就是
     通过组合其叶子查询或者其它复合查询的方式,进行分组,筛选等操作。

(2)、match查询的原理:
      如果查询的字段是可以分词的字段,就对筛选条件进行分词匹配,是一种全文搜索,会返回结果,
     并且按照分数进行排序。

(3)、trem查询的原理:
根据查询筛选条件,进行倒排索引搜索,也就是在存入的时候,根据字段和分词规则已经生成了倒排索引,
查询的时候筛选条件不做分词,直接拿去合倒排索引进行匹配。
       

(4)、match_phrase原理
        进行分词的时候,分词后的词语都是挨着的,那么筛选条件如果是要跨过几个词语之后组成的筛选条件,
就无法进行搜索了,所以这个时候需要来指定可以跨过几个词语进行筛选(slop:2)

GET /shakespeare/_search
{
  "query": {
    "match_phrase": {
      "text_entry": {
        "query": "ACT I",
        "analyzer": "ik_smart",
        "slop": 2
      }
    }
  }
}

(5)、fifter:

fifter和query的区别就在于,fifter是和分数无关的,筛选出符合的文档,
并不计算得分,且它可以缓存文档。所以,单从性能考虑,过滤比查询更快。
过滤适合在大范围筛选数据,而查询则适合精确匹配数据。
一般应用时,应先使用过滤操作过滤数据,然后使用查询匹配数据。

(6)、结构化文档查询

根据结构化的数据(例如ip、商品的id、价格等分词后无意义的数据)来精准查询文档,
与全文检索不同,查询的关键字不进行分词,直接去es中匹配文档(倒排索引)。

term:精确匹配
terms:相当于多个term查询
GET idx_item/_search
{
  "query": {
    "terms": {"title": ["苏泊尔","小米"]}
  }
}
exists query:查询有name字段的文档
GET idx_pro/_search
{
  "query": {
    "exists": {
      "field": "name"
    }
  }
}

range query:范围查询
GET _search
{
    "query": {
        "range" : {
            "age" : {
                "gte" : "2019-12-10",
                "lte" : "2020-11-11",
                "format" : "yyyy-MM-dd"
            }
        }
    }
}

ids query:根据_id查询数据
GET /_search
{
    "query": {
        "ids" : {
            "values" : ["1", "4", "100"]
        }
    }
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐