ElasticSearch之search API

写在前面

本文看下查询相关内容,这也是我们在实际工作中接触的最多的,所以有必要好好学习下!

1:查询的分类

主要分为如下2类:

1:基于get查询参数的URI search
2:基于post body的request body search,需要用到es的dsl(domain sepecific language)

不管是哪种查询方式,都需要指定要查询的索引,如下几种方式:

分别来看下URI search和request body search。

另,测试数据参考这里

这种方式是通过在uri上设置参数来进行查询,可以设置的参数如下:

1:q 使用query string syntax,来指定要查询值,相对比较复杂,后边会单独看下
2:df,defaut field,默认字段,如果是不指定的话则会对所有字段查询
3:sort 排序
4:from,size,分页
5:profile,可以查看查询是如何被执行的

2.1:泛查询

  • 查询包含2012的文档

    来看下其查询方式,在 "profile"->"shards"->"searches",如下图:
  • 泛查询指定df

    看下查询方式:

2.2:指定字段查询

在q中指定字段:

查询方式:

2.3:Term VS Phrase

假定现在我们要查询title中包含"Beautiful Mind"的文档信息,第一个想法可能是使用下边这种方式来查询:

但是,并不是我们期望的结果,我们通过查询方式来看下:

此时Mind是泛查询。.

同sql语句:

sql 复制代码
select * from t where title like "%Beautiful%"
union
(
    select * from t where title like "%Mind%"
    union
    select * from t where id like "%Mind%"
    union
    select * from t where year like  "%Mind%"
    ...
)

那我们如何让es把"Beautiful Mind"当作一句话来查询呢,这就要用到PhraseQuery,也比较简单,只需要使用""括起来就行了:

看下查询方式:

2.4:分组查询

2.4.1:AND OR

  • AND

    同写法:

    即系统默认就是按照带+好处理的,即must,如果想要查询包含Beautiful但是不包含Mind的,则在Mind前用-

    查询的过程是先执行如下的TermQuery title:beautiful查询到title包含Beautiful的结果集1,然后再执行TermQuery title:Mind查询到title包含Mind的结果集2,然后取A和B的差集获取最终结果:
  • OR

    和AND比较类似,可对比学习。

2.4.2:范围查询

实例们:

2.4.3:通配符,模糊,正则

实例们:

3.1:查询所有

查询方式可以看到是MatchAllDocsQuery

3.2:查询所有

可以看到虽然是分页查询,但是查询方式和全量查询是一样的,都是MatchAllDocsQuery,并且查询越往后的数据,效率越低,所以es最好不要用来做分页查询,通过其他方案来实现。

3.3:排序

查询方式可以看到是MatchAllDocsQuery,所以效率也不会高,要慎用。

3.4:只返回指定字段

正常相当于sqlselect *这里相当于sqlselect order_date,order_id

3.5:脚本字段

相当于sqlselect concat('order_date', '_hello') as 'my_custom_field'

3.6:match查询

效果同uri searchGET movies/_search?q=title:(Last OR Christmas),即默认的操作符是OR,可以使用operator来显式指定操作符:

3.7:match_phrase 短语查询

等同于uri searchGET movies/_search?q=title:"Last Christmas"

允许中间有其他单词,可如下搜索:

等同于uri searchGET movies/_search?q=title:"one love"~1

3.8:query_string 查询

dsl的query下写query_string有点像泛查询。

同uri searchGET movies/_search?q=on。其实就是不同的写法而已,多一种写法,多个选择,适应更多的应用场景。

当然也可以指定字段,增加default_field即可:

3.9:simple_query_string 查询

dsl的query下写simple_query_string有点像泛查询。


有需要用query string就行了,这里知道即可。

写在后面

参考文章列表

相关推荐
Karoku0661 天前
【企业级分布式系统】ELK-企业级日志分析系统
运维·数据库·redis·mysql·elk·缓存
一名技术极客2 天前
徒手从零搭建一套ELK日志平台
elk
jun7788954 天前
SpringBoot整合ELK使用详解
spring boot·后端·elk
yueqingll4 天前
023、ELK 从入门到实践
elk
abandondyy4 天前
ELK Elasticsearch 集群部署
大数据·elk·elasticsearch
小李叭叭叭4 天前
ELK8.15.4搭建开启安全认证
运维·elk·elasticsearch·kibana
光仔December11 天前
【Elasticsearch入门到落地】1、初识Elasticsearch
大数据·elk·elasticsearch·搜索引擎·lucene
太空眼睛13 天前
【EFK】Linux集群部署Elasticsearch最新版本8.x
linux·elk·elasticsearch·efk·master·8.15.3·node.roles
Shenqi Lotus16 天前
ELK-ELK基本概念_ElasticSearch的配置
elk·elasticsearch