Juconcurrent 学而不思则罔,思而不学则殆。

Elasticsearch学习笔记(10) - Request Body Search简介


Elasticsearch建议我们尽量使用Request Body查询的方式,这种方式支持的语法更丰富。

常用语法

先来看一个简单的例子。这个例子会查询两个索引(movies和404_idx)的全部文档。理论上,如果404_idx索引不存在,Elasticsearch将返回错误。但是,由于ignore_unavailable参数的缘故,执行将忽略不可用的索引。

# ignore_unavailable=true,可以忽略尝试访问不存在的索引“404_idx”导致的报错
POST /movies,404_idx/_search?ignore_unavailable=true
{
    "profile": true,
    "query": {
        "match_all": {}
    }
}

我们还可以使用 from / size 组合来实现分页。

POST /kibana_sample_data_ecommerce/_search
{
    "from":10,
    "size":20,
    "query":{
        "match_all": {}
    }
}

我们还可以使用sort来实现排序。如果需要像sql语句一样对多个字段排序,可以在sort里面传入多个元素。

# 对日期排序
POST kibana_sample_data_ecommerce/_search
{
    "sort":[{"order_date":"desc"}],
    "query":{
        "match_all": {}
    }
}

Elasticsearch查询的结果过多,会影响执行的效率。因此,我们可以通过_source过滤的方式来减少查询的字段。

# source filtering
POST kibana_sample_data_ecommerce/_search
{
    "_source":["order_date"],
    "query":{
        "match_all": {}
    }
}

Elasticsearch还支持painless脚本字段,这种机制可以通过脚本的方式做一些简单的操作,比如:字符串拼接。在订单场景,订单有不同的汇率信息,通过脚本计算,我们可以针对计算的结果排序。

GET kibana_sample_data_ecommerce/_search
{
    "script_fields": {
        "new_field": {
            "script": {
                "lang": "painless",
                "source": "doc['order_date'].value+'hello'"
            }
        }
    },
    "query": {
        "match_all": {}
    }
}

在query match中,查询的内容默认是OR的方式。如下所示:

POST movies/_search -- 默认为OR
{
    "query": {
        "match": {
            "title": "last christmas"
        }
    }
}

如果要使用AND的方式,可通过指定operator为and来实现。

POST movies/_search
{
    "query": {
        "match": {
            "title": {
                "query": "last christmas",
                "operator": "and"
            }
        }
    }
}

另外,我们还可以使用短语查询的方式。即:phrase query。默认短语中间不能有间隔,但是可使用slop=1来表示中间可以间隔一个term(单词)。

POST movies/_search
{
    "query": {
        "match_phrase": {
            "title":{
                "query": "one love",
                "slop": 1
             }
        }
    }
}

Query string && Simple query string

Elasticsearch还支持query string和simple query string。先来看看query string,这种方式支持分组和多字段。

POST users/_search
{
    "query": {
        "query_string": {
            "default_field": "name",
            "query": "Zhang AND Fubing"
        }
    }
}

simple query string,类似于query string,但是有以下不同:

  1. 会忽略错误的语法,且只支持部分查询语法
  2. 不支持ANDORNOT,如果出现这些term,将被当做字符串处理
  3. term之间默认的关系是OR,可指定default_operator
  4. 支持部分逻辑,+代替AND|代替OR-代替NOT
POST users/_search
{
    "query": {
        "simple_query_string": {
            "query": "Zhang Fubing",
            "fields": ["name"],
            "default_operator": "AND"
        }
    }
}

参考

  1. https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html
  2. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
  3. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html
  4. 【阮一鸣老师的极客时间视频】

Content