elasticsearch基础语法(DSL)
一、curd基本操作(原生api)1、查询出所有索引类似于sql的查询节点信息GET _cat/indices2、创建索引,指定mapping(映射关系)类似于sql的创建表,指定表字段的各种属性PUT bank{"mappings": {"properties": {"id":{"type": "integer"},"en_name":{"type": "keyword"},"zn_name":
·
一、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"]
}
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)