Elasticsearch Search API

当执行一个搜索时,它将这个搜索请求广播给所有的索引分片。可以通过提供路由参数来控制要搜索哪些分片。例如,当检索tweets这个索引时,路由参数可以设置为用户名:

curl -X POST "localhost:9200/twitter/_search?routing=kimchy" -H 'Content-Type: application/json' -d'
{
    query": {
        bool : {
            must : {
                query_string : {
                    " : some query string here
                }
            },filterterm" : { userkimchy }
            }
        }
    }
}
'

1.  Search

查询可以提供一个简单的查询字符串作为参数,也可以用一个请求体。

1.1.  URI Search

这种方式用的很少,就不细说了,举个例子吧:

curl -X GET localhost:9200/product/_search?q=category:honor&sort=price:asc"

1.2.  Request Body Search

同样,举个例子:

curl -X GET localhost:9200/twitter/_search : {
         }
    }
}
'

1.2.1.  Query

可以用 Query DSL 定义一个query

curl -X GET localhost:9200/_search1.2.2.  From / Size

通过 from 和 size 参数,可以分页查询。from 表示从第几条开始取,size 表示最多取多少条。from默认值是0,size默认值是10

curl -X GET localhost:9200/product/_searchfrom0,1)">size101.2.3.  Sort

可以按一个或多个字段排序

有一些特殊的排序字段:_score 表示按分数排序,_doc 表示按索引顺序排序

假设有这样一个索引:

curl -X PUT localhost:9200/my_indexmappings_doc: {
            properties: {
                post_date": { type": date },1)">: {
                    keyword
                },1)">nameageinteger'

针对这个索引,我们这样来查询:

curl -X GET localhost:9200/my_index/_searchsort : [
        { " : {orderasc}},{ desc_score
    ],1)">'

这个例子,依次按照 post_date升序、user升序、name降序、age降序、分数升序排序

(PS:_doc是最有效的排序,如果不关心文档的返回顺序的话)

Elasticsearch支持按数组或者多值字段排序,mode选项用来控制基于数组中的那个值来对文档进行排序。mode选项的可选值有:

  • min :最小值
  • max :最大值
  • sum :用所有值的和来作为排序值
  • avg :用所有值的平均值作为排序值
  • median :用所有值的中间值作为排序值

举个例子:

curl -X PUT localhost:9200/my_index/_doc/1?refresh{
   productchocolateprice": [20,4]
}
'
curl -X POST  : {
       }
   },1)"> : [
      {",1)">modeavg}}
   ]
}
'

什么意思呢?也就说,字段的值可能是一个数组,或者该字段值有多个,那么当我们按这种字段排序的时候就必须确定在排序的时候这个字段的值是什么,也就是该字段的排序值

所谓的mode选项就是用来确定这种字段的最终排序值的,比如:取字段值数组中最小的那个值作为该字段的排序值,或者取最大、或者平均值等等

上面的例子中,price字段值是一个数组,数组有两个元素,后面的查询指定的mode是avg,意味着price字段在排序的时候它的排序值是 (20+4)/2=12

上例中,对结果集按price字段升序排序,price字段的排序值是price字段值求平均

Mission

mission 参数用于指定当文档没有这个字段时该如何处理,可选值是:_last 和 _first ,默认是 _last

类似于关系型数据库中字段为NULL的记录都放在最后

curl -X GET missing_last} }
    ],1)">1.2.4.  Source filtering

可以控制 _source 字段怎样返回

默认返回 _source字段的内容,当然你可以设置不返回该字段,例如:

curl -X GET _source": false'

正常情况下,返回是这样的:

{
        _index_type_id31.0 : {
          productNameHonor Note10categoryHonor2499
        }
}

禁用后是这样的:


}

还可以用通配符,以进一步控制_source中返回那些字段:

curl -X GET localhost:9200/product/_search?prettyproduct*match_all : {}
    }
}
'

或者

curl -X GET abc*],1)">1.2.5.  高亮

curl -X GET matchMI }
    },1)">highlightfields: {}
        }
    }
}
'

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-highlighting.html

1.2.6.  Explain

执行计划可以看到分数是怎样计算出来的

curl -X GET explaintrue'

1.3.  Count

curl -X GET localhost:9200/product/_doc/_count?pretty&q=category:honor

curl -X GET localhost:9200/product/_doc/_count?prettyhonor
{
  count3_shards : {
    total5successfulskippedfailed
  }
}

2.  Aggregations

相当于关系型数据库中的聚集函数(或者叫聚合函数)

聚合可以嵌套!聚合可以嵌套!!聚合可以嵌套!!!

聚合主要有4种类型:

  • Bucketing
  • Mertric
  • Matrix
  • Pipeline

基本的聚合结构是这样的:

aggregations 是一个JSON对象,它代表一个聚合。(PS:这个关键字也可以用 aggs )

  1. 每个聚合都关联了一个逻辑名称(例如:如果聚合计算平均价格,那么在这个场景下我可以给这个聚合起个名字叫“avg_price”)
  2. 在响应结果中,这些逻辑名称用于唯一标识一个聚合
  3. 每个聚合都有一个指定的类型(比如:sum ,avg ,max ,min 等等)
  4. 每个聚合类型都定义了自己的body

2.1.  Metrics Aggregations

这种类型的聚合是基于以某种方式从聚合的文档中提取的值来计算度量。这个值通常取自文档的字段值,也可以通过脚本计算得到的。

数值度量聚合是一种特殊的度量聚合,它输出数值。根据输出值的多少,分为单值数值度量聚合(比如:avg)和多值数值度量聚合(比如:stats)。

2.1.1.  Avg

从文档的数值字段中提取值进行计算

假设,我们的文档是学生成绩(0~100),我们可以求平均分数:

curl -X POST localhost:9200/exams/_search?size=0aggs:{
        avg_grade:{
            :{
                field":grade
            }
        }
    }
}
'

上面的聚合例子,计算所有学生的平均成绩。这里的聚合类型是avg,field指定哪个字段用于计算。

再来一个例子:

请求:
curl -X POST localhost:9200/product/_search?size=0avg_price
响应:
{
    took13timed_out":
    },1)">hits7max_score:[

        ]
    },1)">aggregationsvalue2341.5714285714284
        }
    }
}

默认情况下,没有那个字段的文档将被忽略(PS:就像关系型数据库中求平均值时会忽略NULL的记录一样),我们可以给它指定一个值,例如:

curl -X POST grade_avg 
            }
        }
    }
}
'

如果文档没有grade字段,那么用10作为该字段值参与计算

2.1.2.  Sum

从文档的数值字段中提取值进行计算

constant_score:{
                    vivo
                }
            }
        }
    },1)">vivo_pricessum23796
        }
    }
}

求category字段值匹配vivo的商品的价格总和

相当于,select sum(price) from product where category like '%vivo%' group by category

2.1.3.  Max

从文档的数值字段中提取值进行计算

curl -X POST localhost:9200/sales/_search?size=0max_price : { 
            max : { 
                 
            } 
        }
    }
}
2.1.4.  Stats

这是一个多值聚合,它返回 min ,max ,sum ,count ,avg 的组合结果

curl -X POST grades_statsstats'

它的返回可能是这样的:

{
    ...

    min50.0100.075.0150.0
        }
    }
}

再来一个例子:

product_stats998429916391
        }
    }
}

2.2.  Bucket Aggregations

可以理解为范围聚合,它的结果是一段一段的,一个一个的bucket

2.2.1.  Range

每个Range包含from,不包含to

前闭后开区间

curl -X GET price_rangesrangeranges : [
                    { to100.0,1)">200.0 }
                ]
            }
        }
    }
}
'

返回可能是这样的:

{
    ...
    buckets: [
                {
                    key*-100.0doc_count100.0-200.0200.0-*
                }
            ]
        }
    }
}

再比如:

请求:
curl -X GET 10001000,1)">20001:[
            {
                5MI 82Honor Magic24MI Max210996vivo X2327981Honor 1021997vivo Z1
                }
            }
        ]
    },1)">:[
                {
                    *-1000.01000.0-2000.02000.0-*
                }
            ]
        }
    }
}

代替返回一个数组,可以设置keyed为true,这样可以给每个bucket关联一个位于的字符串key,例如:

curl -X GET keyed" : 100100,1)">200'

于是返回变成这样了:


                }
            }
        }
    }
}

当然,我们也可以给每个范围区间自定义key:

curl -X GET cheapaverageexpensive'

返回:


                }
            }
        }
    }
}

举个栗子:

}
    },1)">lowmediumhigh0.98082920.69314720.2876821
                }
            }
        }
    }
}

2.2.2.  Filter

先过滤再聚合

:{
                        
                    }
                }
            }
        }
    }
}
1898
            }
        }
    }
}

2.2.3.  Terms Aggregation

相当于关系型数据库中的分组(group by)

curl -X GET genrestermsgenre }
        }
    }
}
doc_count_error_upper_boundsum_other_doc_count : [ 
                {
                    electronic6rockjazz
                }
            ]
        }
    }
}

再举个例子:

group_by_category16mi
                }
            ]
        }
    }
}

size 可以用于指定返回多少个term bucket


响应:
{
    ...
    
    
                }
            ]
        }
    }
}

3.  示例

排序

curl -X POST 
}

 }
}

curl -X POST  } }
}
null:[
                    
                ]
            },1)">
                ]
            }
        ]
    }
}

分组求平均


            },1)"> : {
                        2999
                    }
                },1)">1799
                    }
                }
            ]
        }
    }
}

4.  示例索引

curl -X PUT localhost:9200/product": {text},1)">fielddata}
            }
        }
    }
}
localhost:9200/product/_doc/_bulk' --data-binary @product.json


{index } }
{}
{998}

5.  参考

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket.html

6.  其它相关

Elasticsearch查询

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读774次,点赞24次,收藏16次。typescript项目中我们使用typings-for-css-modules-loader来替代css-loader实现css modules。1、typings-for-css-modules-loader加载器介绍 Webpack加载器,用作css-loader的替代产品,可动态生成CSS模块的TypeScript类型这句话是什么意思呢?就是编译时处理css文件...
文章浏览阅读784次。react router redux antd eslint prettier less axios_react+antd+redux+less
文章浏览阅读3.9k次,点赞5次,收藏11次。需要删除.security-7索引文件。把在第1步中的被注释的配置打开。之后就是按照提示输入密码。执行bin目录下的文件。_failed to authenticate user 'elastic' against
文章浏览阅读1.2k次,点赞23次,收藏24次。Centos 8 安装es_centos8 yum elasticsearch
文章浏览阅读3.2k次。设置完之后,数据会⾃动同步到其他节点。修改密码时,将第⼀步配置删除,然后重启。单独使⽤⼀个节点⽣成证书;执⾏设置⽤户名和密码的命令。执⾏完上⾯命令以后就可以在。⽂件,在⾥⾯添加如下内容。这个⽂件复制到其他节点下。其中⼀个节点设置密码即可。依次对每个账户设置密码。全部节点都要重启⼀遍。需要在配置⽂件中开启。个⽤户分别设置密码,⽬录下,证书⽂件名为。功能,并指定证书位置。_es设置账号和密码
文章浏览阅读1.9k次,点赞2次,收藏7次。针对多数据源写入的场景,可以借助MQ实现异步的多源写入,这种情况下各个源的写入逻辑互不干扰,不会由于单个数据源写入异常或缓慢影响其他数据源的写入,虽然整体写入的吞吐量增大了,但是由于MQ消费是异步消费,所以不适合实时业务场景。不易出现数据丢失问题,主要基于MQ消息的消费保障机制,比如ES宕机或者写入失败,还能重新消费MQ消息。针对这种情况,有数据强一致性要求的,就必须双写放到事务中来处理,而一旦用上事物,则性能下降更加明显。可能出现延时问题:MQ是异步消费模型,用户写入的数据不一定可以马上看到,造成延时。_mysql同步es
文章浏览阅读3.6w次,点赞48次,收藏44次。【程序员洲洲送书福利-第十九期】《C++ Core Guidelines解析》
文章浏览阅读1.3k次。当我们在开发Vue应用时,经常需要对表单进行校验,以确保用户输入的数据符合预期。Vue提供了一个强大的校验规则机制,通过定义rules规则,可以方便地对表单进行验证,并给出相应的错误提示。_vue ruler校验
文章浏览阅读2k次,点赞16次,收藏12次。Linux内核源码下载地址及方式_linux源码下载
文章浏览阅读1k次。这样在每天自动生成的索引skywalking_log_xxx就会使用上述模版来生成,timestamp会被设置成date类型。然后此时在–>索引管理–>kibana–>索引模式添加skywalking_log*索引时就会有时间字段了。在通过skywalking将日志收集到es后,由于skywalking收集的日志(skywalking_log索引)没有date类型的字段导致在es上再索引模式中没有时间范围的查询。skywalking收集的日志有时间戳字段timestamp,只是默认为long类型。_skywalking timestamp
文章浏览阅读937次,点赞18次,收藏21次。1.初始化git仓库,使用git int命令。2.添加文件到git仓库,两步走:2.1 使用命令,注意,可反复多次使用,添加多个文件;2.2 使用命令,完成。此笔记是我个人学习记录笔记,通过廖雪峰的笔记进行学习,用自己能理解的笔记记录下来,如果侵权,联系删。不存在任何盈利性质,单纯发布后,用于自己学习回顾。
文章浏览阅读786次,点赞8次,收藏7次。上述示例中的 origin 是远程仓库的名称,https://github.com/example/repository.git 是远程仓库的 URL,(fetch) 表示该远程仓库用于获取更新,(push) 表示该远程仓库用于推送更新。你可以选择在本地仓库创建与远程仓库分支对应的本地分支,也可以直接将本地仓库的分支推送到远程仓库的对应分支。将 替换为远程仓库的名称(例如 origin), 替换为要推送的本地分支的名称, 替换为要推送到的远程分支的名称。_git remote 智能切换仓库
文章浏览阅读1.5k次。配置eslint校验代码工具_eslint 实时校验
文章浏览阅读1.2k次,点赞28次,收藏26次。Git入门基础介绍,什么是Git,如何使用Git,以及Git的工作的基本原理
文章浏览阅读2.7k次。基于官方给出的几种不同环境不同的安装方式,本文将会选择在使用.zip文件在Windows上安装Elasticsearch在Linux或macOS上从存档文件安装ElasticsearchInstall Elasticsearch with Docker (此种方式待定)使用Docker安装Elasticsearch。_elasticsearch安装部署windows
文章浏览阅读3.3k次,点赞5次,收藏11次。【Linux驱动】内核模块编译 —— make modules 的使用(单模块编译、多模块编译)_make modules
文章浏览阅读1k次。docker启动es报错_max virtual memory areas vm.max_map_count [65530] is too low, increase to at
文章浏览阅读4.2k次,点赞2次,收藏6次。使用docker单机安装elasticsearch后再安装kibana时找不到es。_unable to retrieve version information from elasticsearch nodes. security_ex
文章浏览阅读1.1k次。日志处理对于任何现代IT系统都是关键部分,本教程专为新手设计,通过详细解释Logstash的三大核心组件,为您展示如何从零开始搭建强大的日志处理系统。您还将学习如何同步MySQL数据到Elasticsearch,并通过一个"Hello World"示例快速入门。无论您是完全的新手还是有一些基础,本教程都将引导您顺利掌握Logstash的基本操作和高级应用。_logstash mysql
文章浏览阅读1.1w次,点赞5次,收藏25次。执行这条指令之后,你的本地项目就与远程Git仓库建立了连接,你就可以开始对你的代码进行版本追踪和协作开发了。使用“git remote add origin”指令,可以轻松地将本地项目连接到远程Git仓库。git remote set-url origin 执行这条指令之后,Git就会将已经添加的名为“origin”的仓库删除。git remote add origin 其中,是你的远程Git仓库的网址。_git remote add origin