本文看下查询相关内容,这也是我们在实际工作中接触的最多的,所以有必要好好学习下!
主要分为如下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,可以查看查询是如何被执行的
假定现在我们要查询title中包含”Beautiful Mind“的文档信息,第一个想法可能是使用下边这种方式来查询:
但是,并不是我们期望的结果,我们通过查询方式来看下:
此时Mind是泛查询。.
同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,也比较简单,只需要使用""
括起来就行了:
看下查询方式:
-
:
可以看到虽然是分页查询,但是查询方式和全量查询是一样的,都是MatchAllDocsQuery
,并且查询越往后的数据,效率越低,所以es最好不要用来做分页查询,通过其他方案来实现。
查询方式可以看到是MatchAllDocsQuery
,所以效率也不会高,要慎用。
正常相当于sqlselect *
这里相当于sqlselect order_date,order_id
。
相当于sqlselect concat('order_date', '_hello') as 'my_custom_field'
。
效果同uri searchGET movies/_search?q=title:(Last OR Christmas)
,即默认的操作符是OR,可以使用operator来显式指定操作符:
等同于uri searchGET movies/_search?q=title:"Last Christmas"
。
允许中间有其他单词,可如下搜索:
等同于uri searchGET movies/_search?q=title:"one love"~1
。
dsl的query下写query_string有点像泛查询。
同uri searchGET movies/_search?q=on
。其实就是不同的写法而已,多一种写法,多个选择,适应更多的应用场景。
当然也可以指定字段,增加default_field
即可:
dsl的query下写simple_query_string有点像泛查询。
有需要用query string就行了,这里知道即可。