Elasticsearch请求类型和使用说明

说明

ElasticSearch请求类型很多,支持精确、模糊、组合、正则、范围等,为复杂查询提供保证。

分享

查询说明

  • Elasticsearch有不同类型和查询规则,大致总结如下,后续根据实际情况修正,学无止境。

查询方式

方式名说明特点
term精准查询字段和内容完全匹配
terms精准查询term扩展,支持单字段多内容查询
match_all查询全部信息查询index全部信息
match分词匹配查询单字段分词匹配查询
multi_match分词匹配查询多字段分词匹配查询
match_phrase分词匹配查询首先将查询字符串解析成一个词项列表,然后对这些词项进行搜索,但只保留那些包含 全部 搜索词项,且 位置与搜索词项相同的文档
query_string类似matchmatch需要指定字段名,query_string不需要指定字段名,是在所有字段中搜索,范围更广泛。
fuzzy模糊查询满足查询的指定字符个数即可
wildcard通配符查询允许指定一个模式来匹配,而不需要指定完整的trem,匹配的方式类似于match的分词匹配查询,可使用?和*
bool布尔查询支持should(或)、must(与)、must_not(非)
range范围查询integer、long、double、data、ip等类型数据的范围查询,通过relation设置关系:within、contains、intersects
regexp正则查询通过正则搜索字段中满足条件的数据
prefix前缀匹配查询
exists字段查询文档字段是否有值
missing字段查询文档字段是否为空
fuzzy_like_this文档搜索
fuzzy_like_this_field文档搜索
more_like_this文档搜索
more_like_this_field文档搜索

查询方式加字段类型

方式数据类型特点
termkeywordterm不分词,keyword字段也不分词,需要完全匹配才可
termtextterm不分词,text字段分词,所以term查询条件必须是text字段分词后的某一个。
matchkeywordmatch分词,keyword不分词,match的需要跟keyword的完全匹配可以。
matchtextmatch分词,text分词,只要match的分词结果和text的分词结果有相同的就匹配
match_phrasekeywordmatch_phrase的需要跟keyword的完全匹配才可以。
match_phrasetextmatch_phrase是分词的,text也是分词的。match_phrase的分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。
query_stringkeyword无法查询
query_stringtext不需要连续,顺序还可以调换。

查询实例

以下查询全部以post类型,请求地址:http://127.0.0.1:9200/索引名/_search

精确匹配

term

单字段或多字段单值精确查询,请求数据:

{
    "query": {
        "term": {
            "name.keyword": "张三"
        }  
    }
}
  • 响应:
{
    "_shards":{
        "total":1,
        "failed":0,
        "successful":1,
        "skipped":0
    },
    "hits":{
        "hits":[
            {
                "_index":"userindex",
                "_type":"_doc",
                "_source":{
                    "args":20,
                    "createtm":"2018-4-5 11:07:23",
                    "name":"张三",
                    "description":"张三是java开发工程师",
                    "id":1
                },
                "_id":"one",
                "_score":0.6931471
            }
        ],
        "total":{
            "value":1,
            "relation":"eq"
        },
        "max_score":0.6931471
    },
    "took":2,
    "timed_out":false
}

terms

字段多值精确查询,请求数据实例:

{
    "query": {
        "terms": {
            "name.keyword": ["张三","思路"]
        }
    }
}
  • 响应:
{
    "_shards":{
        "total":1,
        "failed":0,
        "successful":1,
        "skipped":0
    },
    "hits":{
        "hits":[
            {
                "_index":"userindex",
                "_type":"_doc",
                "_source":{
                    "args":20,
                    "createtm":"2018-4-5 11:07:23",
                    "name":"张三",
                    "description":"张三是java开发工程师",
                    "id":1
                },
                "_id":"one",
                "_score":0.6931471
            }
        ],
        "total":{
            "value":1,
            "relation":"eq"
        },
        "max_score":0.6931471
    },
    "took":2,
    "timed_out":false
}

分词匹配

match

单字段分词匹配查询,如果是中文,如查询字段name为张三,结果会返回name包含张和三的数据。请求数据实例:

{
    "query":{
        "match":{
            "name":"zhangsan"
        }
    }
}

match_all

查询index所有数据,请求数据实例:

{
    "query":{
        "match_all":{
        }
    }
}

multi_match

多字段分词匹配查询,请求数据实例:

{
    "query":{
        "multi_match":{
            "query":"zhangsan",
            "fields":["name","description"]
        }
    }
}

match_phrase

短语匹配查询,ElasticSearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词,并且保证各个分词的相对位置不变。请求数据实例:

{
    "query":{
        "match_phrase":{
            "name":"zhangsan lisi"
        }
    }
}

模糊查询fuzzy

可以纠正查询时输入内容部分错误,fuzziness设置最小匹配字符。请求数据实例:

{
    "query":{
        "fuzzy":{
            "name":{
                "value":"lisss",
                "fuzziness":2
            }	
        }
    }
}

通配符查询wildcard

通配符支持一定模式匹配,查询方式类似term的分词匹配,请求数据实例:

{
    "query":{
        "wildcard":{
            "name":"li*"
        }
    }
}

组合查询 bool

汇集其他查询为一体的复杂查询

should或

多个字段内容匹配,关系为。请求数据实例:

{
    "query":{
        "bool":{
            "should":[
                { "match" : { "name":"zhangsan" }},
                { "match" : { "name":"lisi"}}
                ]
        }
    }
}

must与

多个字段内容匹配,关系为。请求数据实例:

{
    "query":{
        "bool":{
            "must":[
                { "match" : { "name":"zhangsan" }},
                { "match" : { "name":"lisi"}}
                ]
        }
    }
}

must_not非

多个字段内容匹配,不是查询条件的内容。请求数据实例:

{
    "query":{
        "bool":{
            "must_not":[
                { "match" : { "name":"zhangsan" }},
                { "match" : { "name":"lisi"}}
                ]
        }
    }
}

range范围查询

数值数据类型使用range,可以实现数值范围查询,参数如下:

  • gt:大于
  • lt:小于
  • gte:大于等于
  • lte:小于登录
  • format:用于转换日期查询中的日期格式。如果为指定,则使用默认格式。
  • relation:指示范围查询如何匹配range的字段
    • INTERSECTS,默认值;使用具有与查找范围相交的范围字段来匹配文档
    • CONTAINS;使用范围字段值完全包含查询范围的文档进行匹配。
    • WITHIN;使用范围字段值完全在查询范围内的文档进行匹配。
  • time_zone:查询中的值转换为UTC的偏移量或是IANA时区
  • boost:用于减少或增加查询的相关性得分

查询age字段大于等于10,小于等于20,请求数据实例:

{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

regexp正则匹配

通过正则表达式寻找匹配字段,搜索name值满足ac.*ha正则表达式的数据,请求实例如下:

{
  "query": {
    "regexp": {
      "name": "ac.*ha"
    }
  }
}

exists有值查询

查找文档字段是否有值,如查询name字段是否有值,请求实例如下:

{
  "query": {
    "exists": {
      "field": "name"
    }
  }
}

missing无值查询

查找文档字段是否无值,查询name字段是否为空,请求实例如下:

{
  "query": {
    "missing": {
      "field": "name"
    }
  }
}

prefix前追匹配查询

字符串开头匹配,请求实例:

{
    "query":{
        "prefix":{
            "name":"ac"
        }
    }
}

排序+指定位置

_source指定响应字段,from返回结果的位置,size返回结果的最大条数,sort排序,请求数据实例:

{
    "_source":["name","description"],
    "query":{
        "match":{
            "name":"lisi?"
        }
    },
    "size":2,
    "from":0,
    "sort":{
        "age":{"order":"desc"}
    }
}

优化

term数值查询

查询默认使用评分计算,对文档执行包括或排除计算时,使用constant_score+filter以非评分模式且1作为统一评分查询。

//源查询
{
    "query": {
        "term": {
            "age": 30
        }  
    }
}
//优化查询
{
    "query": {
        "constant_score":{
            "filter":{
                "term": {
                    "age": 30
                }  
            }
        }
    }
}

总结

  • Elasticsearch知识学习有一定成果,入门水平,想真正用好,需要实践检验,只有理论的技术缺乏硬度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值