• 搜索和查询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 }

    作者:http://cnblogs.com/lyc-code/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权力。

  • 相关阅读:
    GetIPAddress——获得本地IP地址信息
    NetTime——c++实现计算机时间与网络时间的更新
    redis 面试
    jstat命令
    bug 调试
    redis & memcache
    Java进阶知识点:不要只会写synchronized
    Java进阶知识点:并发容器背后的设计理念
    Java进阶知识点:服务端高并发的基石
    Java进阶知识点:不可变对象与并发
  • 原文地址:https://www.cnblogs.com/lyc-code/p/15227940.html
Copyright © 2020-2023  润新知