elasticsearh中查询类型,term、match、match_all、multi_match、range、bool、boosting等
elasticsearch查询类型
查询方式有如下几种:
GET /<index>/_search
GET /_search
POST /<index>/_search
POST /_search
一般分为如下几类查询:
- 叶子查询语句,如:
match
,term
,range
可以单独使用 - 复合查询语句,组合多个叶子、复合查询为一个查询,例如:
bool
、dis_max
、constant_score
- 昂贵的子查询,一般比较耗时的查询,比如
script queries
、fuzzy queries
、regexp queries
返回查询结果示例说明:
{
"took" : 159, //响应时间,毫秒
"timed_out" : false, // 是否超时
"_shards" : { // 分片信息
"total" : 5, //总数
"successful" : 5, //成功
"skipped" : 0, //忽略
"failed" : 0 // 失败
},
"hits" : { //搜索命中结果
"total" : { //搜索条件匹配的文档总数
"value" : 1, // 总命中计数的值
"relation" : "eq" // 计数规则,eq表示准确,qte表示不准确
},
"max_score" : 1.0, //匹配度分之
"hits" : [ // 命中结果集合
{
"_index" : "goods_info",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"doc" : {
"name" : "ThinkPad 联想 E14 11代i5/I7 2G独显 轻薄便携商务办公学生网课IBM笔记本电脑 i7-1165G7 32G内存 1T固态 定制 2G独显 WiFi6 FHD屏幕 雷电接口"
}
}
}
]
}
}
match_all
查询
match_all没有任何条件,检索文档全部数据,但是可以进行一些排序之类的
match
查询
匹配查询,会将查询条件进行分词,然后进行查询, 多个分词后查询的关系是or
GET /goods_info/_search
{
"query": {
"match": {
"name": "华为电脑"
}
}
}
这里是es官方关于match
查询的详细介绍match查询,其中我们可以看到,有一个operator
选项,在这里我们可以指定分词后查询的关系,默认是上面or
,表示指定的查询语分词后只要匹配到其中一个就行,还有一个是and
表示必须匹配到所有的分词:
GET /goods_info/_search
{
"query": {
"match": {
"detail": {
"query": "华为笔记本电脑",
"operator": "and"
}
}
}
}
这里可以对比下查询后和上面默认的or
选项的差别。
同时在查询的时候我们可以指定查询条件的关键词的分词器,通过analyzer
参数指定。
GET /goods_info/_search
{
"query": {
"match": {
"detail": {
"query": "华为笔记本电脑",
"analyzer": "standard",
"operator": "and"
}
}
}
}
multi_match
查询
与match类似,不同的是可以在多个字段中查询:
GET /goods_info/_search
{
"query": {
"multi_match": {
"query": "华为电脑",
"fields": ["name","detail"]
}
}
}
term
精确查询
term关键字查询,精确匹配,不会对查询条件进行分词:
例如:
GET /goods_info/_search
{
"query": {
"term": {
"brand": {
"value": "笔记本"
}
}
}
}
term查询有点类似SQL中的等值查询,上面的match有点类似SQL中的like模糊匹配。
这个时候如果我们用term去查询name字段,将查询不到信息:
GET /goods_info/_search
{
"query": {
"term": {
"name": {
"value": "笔记本"
}
}
}
}
但是match查询则是可以。
terms
多关键字精确查询
terms支持多个关键字精确查询:
GET /goods_info/_search
{
"query": {
"terms": {
"brand": [
"笔记本",
"手机"
]
}
}
}
range
范围查询
range可以进行范围查询,比如日期,价格:
GET /goods_info/_search
{
"query": {
"range": {
"price": {
"gte": 4000,
"lte": 6000
}
}
}
}
这里我们查询电脑价格在4000到6000价格区间的商品.
range查询中:
- gt 大于
- gte 大于等于
- lt 小于
- lte小于等于
match_phrase
查询
match_phrase
查询主要特性在如下两点:
- 查询条件分词后都必须匹配,类似
match
中的operator
=and
- 文档匹配的顺序必须与查询条件分词匹配后一致
这是官方介绍地址match_phrase
match_phrase_prefix
查询
match_phrase_prefix
基本上和match_phrase
查询差不多,但是会对查询条件分词后的最后一个词项进行prefix前缀匹配查询
match_bool_prefix
查询
match_bool_prefix
查询类似于match_phrase_prefix
,不同的是,match_bool_prefix
没有对查询条件分词后匹配的顺序有限制。
intervals
查询
intervals
允许用户精确控制查询词在文档中出现的先后关系,实现了对terms顺序、terms之间的距离以及它们之间的包含关系的灵活控制,通过intervals query(间隔搜索) 我们可以完成各个terms在于不同位置的灵活搜索
query_string
查询
query_string
查询是一个贴近于luncene语法的查询,可以在一个查询中使用多个特殊关键字(如AND |OR|NOT),需要熟悉lucene语法
simple_query_string
查询
simple_query_string
查询与query_string
查询类似,但是提供更多的选项
bool
查询
boot
查询是一个复合多条件查询,可以指定多个查询条件
POST _search
{
"query": {
"bool" : {
"must" : {
"term" : { "user.id" : "kimchy" }
},
"filter": {
"term" : { "tags" : "production" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
},
"should" : [
{ "term" : { "tags" : "env1" } },
{ "term" : { "tags" : "deployed" } }
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}
}
可以指定如下几个条件:
must
必须满足条件,会增加_score评分must not
必须不满足should
满不满足无所谓,但是如果满足会增加_score评分,主要用于修正文档的相关性评分filter
必须满足条件,但是不会增加评分
比如查询笔记本电脑
但不要显示苹果
相关产品,优先展示2022-08-01
之后上的产品
Filter和Query的区别
:
- filter和must_not属于Filter Context,不会对_score结果产生影响;
- must和should属于Query Context,会对_score结果产生影响
boosting
查询
boosting
用来调节查询的_score
分值,有如下几个分值调节选项:
positive
必须匹配上,匹配上会放入返回的结果列表negative
匹配上positive
在匹配上negative
的文档会被减分negative_boost
减分的系数,0到1之间,如果negative
匹配上之后,这时候会将negative
匹配的文档分数乘以negative_boost
的系数
GET /goods_info/_search
{
"query": {
"boosting": {
"positive": {
"match": {
"name": "笔记本电脑"
}
}
, "negative": {
"match": {
"detail": "苹果"
}
}
, "negative_boost": 0.2
}
}
}
这里我们依旧查询笔记本电脑,但是如果商品是包含苹果关键字,则会降低评分.
详细见: boosting query
constant_score
查询
constant_score
查询会忽略文档默认的_score
相关性评分,而是采用一个统一固定的评分,默认是1.0。
GET /goods_info/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"brand": "笔记本"
}
},
"boost": 1.2
}
}
}
返回的匹配文档的_score会设置为指定的boost
评分
dis_max
查询
dis_max
查询可以指定多个查询条件,这些查询条件之间是or
的关系,但是针对不同条件可以指定不同的boost
算分,将查询结果的最大分数优先返回,除了最大分数,还会讲除最大分数外的其他结果的分数和tie_breaker
相乘并和最大分数比较,看哪个大。
GET /goods_info/_search
{
"query": {
"dis_max": {
"tie_breaker": 0.7,
"queries": [
{
"match": {
"name": "笔记本"
}
},
{
"match": {
"detail": {
"query": "华为",
"boost": 1.5
}
}
}
]
}
}
}
详见: dis_max query
function_score
查询
function_score
查询提供了让用户自定义匹配查询结果的相关性评分,提供了如下几组自定义评分机制:
- script_score
- weight
- random_score
- field_value_factor
- decay functions: gauss, linear, exp
详见:score-functions
exists
查询
对于指定的查询,过滤返回的结果的某个索引字段必须有值
类似如下查询:
GET /goods_info/_search
{
"query": {
"exists": {
"field":"name"
}
}
}
这里查询的是所有索引必须name
字段有值。一般会和其他查询条件组合使用:
GET /goods_info/_search
{
"query": {
"bool": {
"should": {
"match": {
"name": "笔记本"
}
},
"must": {
"exists": {
"field": "brand"
}
}
}
}
}
这里查询商品必须品牌不为空,在这个条件下,商品名称匹配笔记本
需要注意的是,exists是属于term查询,不会进行分词
fuzzy
查询
fuzzy
查询有点类似于模糊匹配的功能,但是ES能够对待匹配的值进行一些修成,比如appla
能够进行修正匹配文档中的apple
GET /goods_info/_search
{
"query": {
"fuzzy": {
"detail": {
"value": "thinkpadjk",
"prefix_length": 0
}
}
}
}
详见: fuzzy query
ids
查询
根据给定的文档id查询
GET /goods_info/_search
{
"query": {
"ids": {
"values": [1,2,3,4,5,6]
}
}
}
prefix
查询
prefix
查询包含指定的前缀内容
GET /goods_info/_search
{
"query": {
"prefix": {
"brand": {
"value": "笔记"
}
}
}
}
wildcard
查询
wildcard
是可以使用通配符的查询,类似于SQL中like功能
GET /goods_info/_search
{
"query": {
"wildcard": {
"brand": "*笔记*"
}
}
}
但是需要注意的是使用wildcard
查询的字段必须是keyword类型
另外就是wildcard
查询比较耗费性能。
regexp
查询
regexp
查询正则表达式查询
指定返回字段
默认情况下,ES会把匹配到的文档在_source
中的字段都返回,我们可以在请求中通过_source
返回指定的字段:
GET /goods_info/_search
{
"_source": ["name","detail"],
"query": {
"match": {
"name": "华为电脑"
}
}
}
另外我们可以在_source
通过includes
和excludes
来指定想要显示和不想要显示的字段:
GET /goods_info/_search
{
"_source":{
"includes": ["name","detail"]
},
"query": {
"match": {
"name": "华为电脑"
}
}
}
通过excludes
指定不想要现实字段:
GET /goods_info/_search
{
"_source":{
"excludes": ["name","detail"]
},
"query": {
"match": {
"name": "华为电脑"
}
}
}
collapse
返回结果折叠
collapse
关键字会对返回的结果,按照sort
排序后只取第一条。
GET /goods_info/_search
{
"query": {
"match": {
"name": "笔记本电脑"
}
},
"collapse": {
"field": "brand"
},
"sort": [
{
"create_time": {
"order": "desc"
}
}
]
}
这里我们查询华为笔记本电脑,返货结果按照create_time
排序,并且通过collapse
每个brand只取排序后的数据的第一条。
highlight
高亮显示返回结果
我们可以针对返回的某些字段增加额外的标签,达到高亮显示效果,ES会对查询的条件分词后再结果字段匹配的部分增加标签:
GET /goods_info/_search
{
"query": {
"match": {
"name": "华为笔记本电脑"
}
}
, "highlight": {
"pre_tags": "<font color='red'>",
"post_tags": "</font>",
"fields": {"name":{}}
}
}
选取其中一条结果查看:
{
"_index" : "goods_info",
"_type" : "_doc",
"_id" : "8",
"_score" : 2.3662727,
"_source" : {
"name" : "华为笔记本电脑MateBook D 14 2022 12代酷睿版 i5 16G 512G 锐炬显卡/轻薄本/14英寸护眼全面屏/超级终端 灰",
"detail" : "华为笔记本电脑MateBook D 14 2022 12代酷睿版 i5 16G 512G 锐炬显卡/轻薄本/14英寸护眼全面屏/超级终端 灰",
"brand" : "笔记本",
"price" : 5299,
"sales_count" : 100000,
"picture" : "https://item.jd.com/100039356468.html",
"click_url" : "https://item.jd.com/100039356468.html",
"create_time" : "2022-08-14"
},
"highlight" : {
"name" : [
"<font color='red'>华</font><font color='red'>为</font><font color='red'>笔</font><font color='red'>记</font><font color='red'>本</font><font color='red'>电</font><font color='red'>脑</font>MateBook D 14 2022 12代酷睿版 i5 16G 512G 锐炬显卡/轻薄<font color='red'>本</font>/14英寸护眼全面屏/超级终端 灰"
]
}
}
详见 highlighting
分页查询
在查询的时候我们可以通过from
、size
来对结果进行分页:
GET /goods_info/_search
{
"query": {
"match": {
"name": "华为笔记本电脑"
}
},
"from": 0,
"size": 2
}
from
默认从0开始,size
是每页的大小。
需要注意的是,默认情况下,使用分页,也不能查询超过10000条数据
如果需要分页查询更多的数据,那么可以使用scroll
或者search_after
更多推荐
所有评论(0)