美文网首页
Elasticsearch学习笔记(10) - Request

Elasticsearch学习笔记(10) - Request

作者: juconcurrent | 来源:发表于2019-07-30 23:00 被阅读0次

    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. 【阮一鸣老师的极客时间视频】

    相关文章

      网友评论

          本文标题:Elasticsearch学习笔记(10) - Request

          本文链接:https://www.haomeiwen.com/subject/eooorctx.html