搜索和查询2.0

一、ES查询上下文结果

took:当前请求消耗多少时间

time_out:当前请求是否超时

shards:分片

  total:一共几个

  successful:成功了几个

  skipped:跳过几个

  failed:失败几个

hits:真正返回给我们的结果

  total

    value:返回几条结果

    relation:查询关系

  max_score:最大评分

  hits:返回结果

    _index:属于哪个索引

    _type:属于哪个类型

    _id:id

    _score:相关度评分

    _source:元数据

 二、相关度评分

_score:相关度评分越高,结果中数据越靠前

三、元数据

_source:source中的结果就是元数据

1、可以禁用source:节省内存开销,禁用source后之前source中展现的属性将不再展示,提高查询效率

  如果只是为了节约磁盘,可以压缩索引比禁用_source更好

1 GET /product/_search
2 {
3   "_source": false,
4   "query": {
5     "match_all": {}
6   }
7 }
这里的禁用只是起到一个查询过滤的作用,没有起到真正的禁用,真正的禁用需要在创建mapping时处理

2、从mappings角度限制查询结果

  但是从mappings角度进行限制不灵活,mappings创建后不能修改

 3、从查询角度限制

 四、Query String

1、带参数查询

GET /product/_search?q=name:xiaomi

2、分页查询

GET /product/_search?from=0&size=2&sort=price:asc

五、全文检索

1、match:按条件搜索

1 GET product/_search
2 {
3   "query": {
4     "match": {
5       "name": "xiaomi"
6     }
7   }
8 }

2、match_all:全部搜索

1 GET product/_search
2 {
3   "query": {
4     "match_all": {}
5   }
6 }

3、multi_match:name或者desc中只要包含query分词后的任意一个即可

  name中包含phone或者huangmenji任意一个即可查出

  desc中包含phone或者huangmenji任意一个即可查出

1 GET product/_search
2 {
3   "query": {
4     "multi_match": {
5       "query": "phone huangmenji",
6       "fields": ["name","desc"]
7     }
8   }
9 }

4、match_phrase:搜索结果中必须包含match_phrase中所有词项,必须连续且顺序必须相同

  搜索结果中xiaomi nfc中不能有其他词项且xiaomi nfc顺序不能发生变化

1 GET product/_search
2 {
3   "query":{
4     "match_phrase": {
5       "name": "xiaomi nfc"
6     }
7   }
8 }

  注意:match和match_phrase会被分词

六、精准查询

1、term:不会被分词

 1 GET product/_search
 2 {
 3   "query": {
 4     "term": {
 5       "name": {
 6         "value": "xiaomi phone"
 7       }
 8     }
 9   }
10 }

 

 注意:上面这个term查询不会搜索到结果,因为term查询不会分词,所以查询条件为xiaomi phone,但是词项字典是根据name分词的,没有xiaomi phone这个词项

2、term、match、match_phrase查询的区别

term查询不会被分词,要注意词项字典中是否包含查询条件

match查询会被分词,查询结果中只需要包含match中的任意一个条件即可被查询出来

match_phrase查询会被分词,查询结果必须包含全部词项,条件顺序不能变化且词项中间不能出现其他词项

注意:以上三者与keyword的区别

   以上三者为查询条件,keyword为数据类型,keyword表示该数据不会被分词,拆分成多个词项放到此项字典中

 1 GET product/_search
 2 {
 3   "query": {
 4     "term": {
 5       "name.keyword": {
 6         "value": "xiaomi phone"
 7       }
 8     }
 9   }
10 }

类比上面term查询案例,此时可以查到结果,因为name这个字段不会被分词,词项字典中的词为name本身

3、terms:terms查询类似sql语句中的in

 1 GET product/_search
 2 {
 3   "query": {
 4     "terms": {
 5       "tags": [
 6         "lowbee",
 7         "gongjiaoka"
 8       ]
 9     }
10   }
11 }

4、range查找

 1 GET product/_search
 2 {
 3   "query": {
 4     "range": {
 5       "price": {
 6         "gte": 399,
 7         "lte": 2999
 8       }
 9     }
10   }
11 }

 七、过滤器

filter:主要为了筛选数据

 1 GET product/_search
 2 {
 3   "query": {
 4     "bool": {
 5       "filter": [
 6         {
 7           "term": {
 8             "name": "phone"
 9           }
10         }
11       ]
12     }
13   }
14 }

 八、组合查询

1、must:会计算相关度分数

 1 GET product/_search
 2 {
 3   "query": {
 4     "bool": {
 5       "must": [
 6         {
 7           "match": {
 8             "name": "xiaomi phone"
 9           }
10         },
11         {
12           "match_phrase": {
13             "desc": "shouji zhong"
14           }
15         }
16       ]
17     }
18   }
19 }

2、filter:不会计算相关度分数,max_score与_score都为0

 1 GET product/_search
 2 {
 3   "query": {
 4     "bool": {
 5       "filter": [
 6         {
 7           "match": {
 8             "name": "xiaomi phone"
 9           }
10         },
11         {
12           "match_phrase": {
13             "desc": "shouji zhong"
14           }
15         }
16       ]
17     }
18   }
19 }

3、must_not

 1 GET product/_search
 2 {
 3   "query": {
 4     "bool": {
 5       "must_not": [
 6         {
 7           "match": {
 8             "name": "xiaomi phone"
 9           }
10         },
11         {
12           "match_phrase": {
13             "desc": "shouji zhong"
14           }
15         }
16       ]
17     }
18   }
19 }

4、should

 1 GET product/_search
 2 {
 3   "query": {
 4     "bool": {
 5       "should": [
 6         {"match_phrase": {
 7           "name": "xiaomi nfc"
 8         }},
 9         {
10           "range": {
11             "price": {
12               "lte": 500
13             }
14           }
15         }
16       ]
17     }
18   }
19 }

5、组合查询

 1 GET product/_search
 2 {
 3   "query": {
 4     "bool": {
 5       "must": [
 6         {"match": {
 7           "name": "xiaomi"
 8         }}
 9       ],
10       "filter": [
11         {
12           "range": {
13             "price": {
14               "lte": 1000
15             }
16           }
17         }
18       ]
19     }
20   }
21 }

 

posted @ 2021-09-05 15:51  showMeTheCodes  阅读(155)  评论(0编辑  收藏  举报