文章目录
说明
ElasticSearch请求类型很多,支持精确、模糊、组合、正则、范围等,为复杂查询提供保证。
分享
查询说明
- Elasticsearch有不同类型和查询规则,大致总结如下,后续根据实际情况修正,学无止境。
查询方式
方式名 | 说明 | 特点 |
---|---|---|
term | 精准查询 | 字段和内容完全匹配 |
terms | 精准查询 | term扩展,支持单字段多内容查询 |
match_all | 查询全部信息 | 查询index全部信息 |
match | 分词匹配查询 | 单字段分词匹配查询 |
multi_match | 分词匹配查询 | 多字段分词匹配查询 |
match_phrase | 分词匹配查询 | 首先将查询字符串解析成一个词项列表,然后对这些词项进行搜索,但只保留那些包含 全部 搜索词项,且 位置与搜索词项相同的文档 |
query_string | 类似match | match需要指定字段名,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 | 文档搜索 |
查询方式加字段类型
方式 | 数据类型 | 特点 |
---|---|---|
term | keyword | term不分词,keyword字段也不分词,需要完全匹配才可 |
term | text | term不分词,text字段分词,所以term查询条件必须是text字段分词后的某一个。 |
match | keyword | match分词,keyword不分词,match的需要跟keyword的完全匹配可以。 |
match | text | match分词,text分词,只要match的分词结果和text的分词结果有相同的就匹配 |
match_phrase | keyword | match_phrase的需要跟keyword的完全匹配才可以。 |
match_phrase | text | match_phrase是分词的,text也是分词的。match_phrase的分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。 |
query_string | keyword | 无法查询 |
query_string | text | 不需要连续,顺序还可以调换。 |
查询实例
以下查询全部以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知识学习有一定成果,入门水平,想真正用好,需要实践检验,只有理论的技术缺乏硬度。