Elasticsearch支持很多查询方式,除了通过9300(默认)端口通过TCP协议进行查询,另一种就是DSL,它是把请求写在JSON里面,然后进行相关查询。
一个DSL例子
GET _search
{
"query": {
"bool": {
"must": [
{ "match": { "name": "Jim" }},
{ "match": { "city": "Guangzhou" }}
],
"filter": [
{ "term": { "weight": "60" }},
{ "range": { "age": { "gte": "18" }}}
]
}
}
}
查询的种类
Elasticsearch中的DSL主要由两部分组成:
Leaf query Cluase 叶查询子句:
这种查询可以单独使用,针对某一特定的字段查询特定的值,比如match、term、range等
Compound query Cluase复合查询子句:
这种查询配合其他的叶查询或者复合查询,用于在逻辑上,组成更为复杂的查询,比如bool
Query与Filter
查询在Query查询上下文和Filter过滤器上下文中,执行的操作是不一样的:
1、查询上下文:是在使用query进行查询时的执行环境,比如使用search的时候。
在查询上下文中,查询会回答这个问题——“这个文档是否匹配这个查询,它的相关度高么?”
ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。即使lucene使用倒排索引,对于某个搜索的分值计算还是需要一定的时间消耗。
2、过滤器上下文:在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter
在过滤器上下文中,查询会回答这个问题——“这个文档是否匹配?”
它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。
另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。
总而言之:
1 查询上下文:查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;
2 过滤器上下文:查询操作仅判断是否满足查询条件,不会计算得分,查询的结果可以被缓存。
所以,根据实际的需求是否需要获取得分,考虑性能因素,选择不同的查询子句。