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就行了,这里知道即可。

写在后面

参考文章列表

相关推荐
幽弥千月19 小时前
【ELK】ES单节点升级为集群并开启https【亲测可用】
elk·elasticsearch·https
IT猿手19 小时前
基于PWLCM混沌映射的麋鹿群优化算法(Elk herd optimizer,EHO)的多无人机协同路径规划,MATLAB代码
算法·elk·机器学习·matlab·无人机·聚类·强化学习
流穿2 天前
ELK系列-(六)Redis也能作为消息队列?(下)
数据库·redis·ubuntu·elk·docker·容器
流穿2 天前
ELK系列-(五)指标收集-MetricBeat(下)
linux·运维·ubuntu·elk·docker·容器
流穿3 天前
ELK系列-(五)指标收集-MetricBeat(上)
ubuntu·elk·elasticsearch·docker
高hongyuan3 天前
Linux环境下 搭建ELk项目 -单机版练习
大数据·运维·服务器·elk·elasticsearch·搜索引擎
运维&陈同学4 天前
【Elasticsearch04】企业级日志分析系统ELK之Elasticsearch 插件
大数据·运维·后端·elk·elasticsearch·搜索引擎·全文检索·哈希算法
幽弥千月5 天前
【ELK】Filebeat采集Docker容器日志
elk·docker·容器
运维&陈同学6 天前
【Elasticsearch03】企业级日志分析系统ELK之Elasticsearch访问与优化
大数据·elk·elasticsearch·搜索引擎·云原生·全文检索·高可用
运维&陈同学8 天前
【Elasticsearch01】企业级日志分析系统ELK之Elasticsearch单机部署
大数据·linux·elk·elasticsearch·微服务·云原生·jenkins