ElasticSearch花式查询

分类专栏:
ElasticSearch相关

文章标签:
ElasticSearch
原创

0.创建实体类与准备查询所用的索引

结构:

1)索引 sms-logs-index
2)类型 sms-logs-type
字段名称 备注
createDate 创建时间
sendDate 发送时间
longCode 发送的长号码
mobile 手机号
corpName 发送公司名称(需要分词检索)
smsContent 下发短信内容(需要分词检索)
state 下发短信状态(0为成功,1为失败)
operatorId 运营商编号(1为移动,2位联通,3为电信)
province 省份
ipAddr 下发服务器ip地址
replyTotal 短信状态报告返回时长(秒)
fee 扣费(分)

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

1.term & terms查询

1)term 查询是代表完全匹配,搜索之前不会对你搜索的关键字进行分词,直接拿关键字去文档分词库中匹配内容
POST /sms-logs-index/sms-logs-type/_search

在这里插入图片描述 在这里插入图片描述

2)terms查询和term机制一样,都不会将关键字进行分词,直接去分词库匹配,terms是针对一个字段包含多个值时使用
POST /sms-logs-index/sms-logs-type/_search
{
  "from": 0,
  "size": 5,
  "query": {
    "terms": {
      "province,keyword": [
        "北京"
      ]
    }
  }
}

在这里插入图片描述

在这里插入图片描述

2.match相关查询

1)match查询属于高层查询,根据查询字段类型不一样,采用不同的查询方式
实际底层就是多个term查询,将多个term查询结果封装到一起
查询一个不能被分词的内容(keyword),match查询不会对你指定的查询关键字进行分词
查询一个能被分词的内容(text),match将指定的查询内容根据一定的方式去分词,然后去分词库匹配
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "match": {
      "smsContent": "山"
    }
  }
}

在这里插入图片描述 在这里插入图片描述

2)match_all 查询全部内容,不指定查询条件
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "match_all": {}
  }
}

在这里插入图片描述 在这里插入图片描述

3)布尔match查询
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "match": {
      "smsContent":{
        "query": "中国 健康",
        "operator": "and"
      }
    }
  }
}

在这里插入图片描述 在这里插入图片描述

4)multiMatch针对多个field进行检索,多个field对应一个text
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "multi_match": {
      "query": "北京",
      "fields": ["province","smsContent"]
    }
  }
}

在这里插入图片描述

在这里插入图片描述

3.id & ids查询

1)id查询
GET /sms-logs-index/sms-logs-type/1

在这里插入图片描述 在这里插入图片描述

2)ids查询
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "ids": {
      "values": ["1","2"]
    }
  }
}

在这里插入图片描述 在这里插入图片描述

4.prefix查询

前缀查询,通过一个关键字去指定一个field的前缀,查询指定文档
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
   "prefix": {
     "corpName": {
       "value": "格力"
     }
   }
  }
}

在这里插入图片描述

在这里插入图片描述

5.fuzzy查询

模糊查询,ElasticSearch根据输入的大概内容匹配内容,查询结果不稳定
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
   "fuzzy": {
     "corpName": {
       "value": "格力汽车",
       "prefix_length": 2
     }
   }
  }
}

在这里插入图片描述 在这里插入图片描述

6.wildcard查询

通配查询,可以在查询时字符串指定通配符*与占位符?
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
   "wildcard": {
     "corpName": {
       "value": "中国*"
     }
   }
  }
}

在这里插入图片描述

在这里插入图片描述

7.rang查询

范围查询,只针对数值类型,对一个field进行大于或者小于的范围指定
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
   "range": {
     "fee": {
       "gt": 5,
       "lt": 10
     }
     }
   }
}

在这里插入图片描述 在这里插入图片描述

8.regexp查询

正则查询,编写正则表达式去匹配内容
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
   "regexp": {
     "mobile": "180[0-9] {8}"
   }
   }
}

在这里插入图片描述 在这里插入图片描述

9.delete-by-query

根据term,match等查询方式删除大量文档
注意:如果删除index下大部分数据,建议创建一个新的index,把保留的文档内容添加到其中
POST /sms-logs-index/sms-logs-type/_delete_by_query
{
  "query": {
   "range": {
     "fee": {
       "lt": 4
     }
     }
   }
}

在这里插入图片描述

在这里插入图片描述

10.filter查询

1)query:根据查询条件计算文档的匹配度得到分数,并根据分数排序(不做缓存)
2)filter:根据查询条件查询,不计算分数且filter会对经常被过滤的数据进行缓存
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
   "bool": {
     "filter": [
       {
         "term": {
           "corpName": "腾讯课堂"
         }
       },
       {
         "range": {
           "fee": {
             "lte": 4
           }
         }
       }
     ]
   }
  }
}

在这里插入图片描述 在这里插入图片描述

11.高亮查询

高亮展示的数据本身是文档中的field,单独将field以hightlight形式返回
1)fragment_size:指定高亮数据返回的字符个数
2)pre_tags:指定前缀标签
3)post_tags:指定后缀标签
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "match": {
      "smsContent": "腾讯课堂"
    }
  },
  "highlight": {
    "fields": {
      "smsContent": {}
    },
    "pre_tags": "<font color='red'>",
    "post_tags": "</font>",
    "fragment_size": "10"
  }
}

在这里插入图片描述

在这里插入图片描述

12.复合查询

复合过滤器,将多个查询条件,用逻辑组合起来
1)must:所有条件组合在一起,类似and的意思
2)must_not:将使用must_not的条件全部不匹配,类似not的意思
3)should:所有条件用should组合在一起,类似or的意思
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "province": {
              "value": "北京"
            }
          }
        },
        {
          "term": {
            "province": {
              "value": "上海"
            }
          }
        } 
      ],
       "must_not": [
        {
          "term": {
            "operatorId": {
              "value": "2"
            }
          }
        }
      ],
      "must": [
        {
          "match": {
            "smsContent": "呼吸"
          }
        },
        {
           "match": {
            "smsContent": "大陆"
        }
        }
      ]
    }
  }
}

在这里插入图片描述 在这里插入图片描述

boosting查询(影响查询后的score)

1)positive:匹配positive的查询内容才会返回到结果集
2)negative:匹配positive和negative,可以降低文档的score
3)negative_boost:指定系数(必须小于1.0)

查询时分数计算:

1)搜索关键字在文档出现的频次高,则分数高
2)指定的文档内容越短,分数越高
3)指定的关键字被分词的内容被分词库匹配的个数越多,则越高
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "boosting": {
      "positive": {
        "match": {
          "smsContent": "xxxxx"
        }
      },
      , "negative": {
        "match": {
          "smsContent": "xxxx"
        }
      },
      "negative_boost": 0.5
    }
  }
}

在这里插入图片描述

在这里插入图片描述

13.深分页scroll

POST /sms-logs-index/sms-logs-type/_search?scroll=1m
{
  "query": {
    "match_all": {}
  },
  "size": 2,
  "sort": [
    {
      "fee": {
        "order": "desc"
      }
    }
  ]
}

POST /_search/scroll
{
  "scroll_id": "<根据第一步得到的scroll_id去指定>",
  "scroll": "<scroll信息的生存时间>"
}

DELETE /_search/scroll/scroll_id

from+size (两者之和不能超1w)

1)将用户指定的关键字进行分词
2)将词汇去分词库中检索,得到多个文档id
3)去各个分片拉取数据
4)根据score将数据进行排序
5)根据from+size的值,丢弃部分数据
6)返回结果

scroll+size(不适合实时查询)

1)将用户指定的关键字进行分词
2)将词汇去分词库中检索,得到多个文档id
3)将文档id放在一个上下文中
4)根据指定size去ElasticSearch中检索指定个数数据,拿完数据文档id(会从上下文移除)
5)如需下一页数据,直接去ElasticSearch上下文找后续内容
6)循环 4)和 5)

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

图片来自本人CSDN

代码上传至码云点我鸭

  • 作者:潘震
  • 评论

    留言