zoukankan      html  css  js  c++  java
  • Elasticsearch 检索

    1、 检索所有文档

    GET bus/product/_search

    2、 term检索

    term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词,所以我们的搜索词必须是文档分词集合中的一个,如果没有安装分词插件,汉字分词按每个汉字来分。

    查询不到内容:
    GET bus/product/_search
    {
      "query": {
        "term": {
            "producer": "公交"
        }
      }
    }
    producer中所有带“公”的文档都会被查询出来
    GET bus/product/_search
    {
      "query": {
        "term": {
            "producer": "公"
        }
      }
    }

    3、 match检索

    match查询会先对搜索词进行分词,分词完毕后再逐个对分词结果进行匹配,因此相比于term的精确搜索,match是分词匹配搜索

    描述中带有机场酒店四个字的各种组合的文档都会被返回
    GET bus/product/_search
    {
      "query": {
        "match": {
          "desc": "机场酒店"
        }
      }
    }

    4、 分页

    GET bus/_search
    {
      "from": 0, 
      "size": 3, 
      "query": {
        "match": {
          "desc": "机场酒店"
        }
      }
    }

    GET bus/_search
    {
      "from": 0,
      "size": 5,
      "query": {
        "match_all": {}
      }
    }

    5、 过滤字段source filtering,类似select a,b from table中a,b。通过_source将缺省返回所有字段进行调整。

    5.1 选择字段,只返回name和desc字段

    GET bus/_search
    {
      "from": 0, "size": 1,
      "_source": ["name","desc"] ,
      "query": {
        "match": {
          "desc": "机场"
        }
      }
    }
    ####
    {
      "took" : 294,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 13,
        "max_score" : 1.9804206,
        "hits" : [
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "8",
            "_score" : 1.9804206,
            "_source" : {
              "name" : "机场大巴A2线",
              "desc" : "机机场场"
            }
          }
        ]
      }
    }

    5.2 禁止_source返回内容

    GET /bus/_search
    {
      "from": 0, "size": 1, 
      "_source": false,
      "query": {
        "match_all": {}
      }
    }
    #####
    {
      "took" : 2,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 27,
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "20",
            "_score" : 1.0
          }
        ]
      }
    }

    5.3 支持通配

    GET /bus/_search
    {
      "from": 0, "size": 1, 
      "_source": "name*",
      "query": {
        "match_all": {}
      }
    }
    ####
    {
      "took" : 0,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 27,
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "20",
            "_score" : 1.0,
            "_source" : {
              "name" : "空港豪华大巴A2线"
            }
          }
        ]
      }
    }

    6、 检索结果显示版本

    GET bus/_search
    {
      "version": true, 
      "from": 0, 
      "size": 3, 
      "query": {
        "match": {
          "desc": "机场酒店"
        }
      }
    }

    7、 按评分检索过滤

    GET bus/_search
    {
      "version": true, 
      "min_score":"2.3", #大于2.3
      "from": 0, 
      "size": 3, 
      "query": {
        "match": {
          "desc": "机场酒店"
        }
      }
    }

    8、 高亮关键字

    GET bus/_search
    {
      "version": true, 
      "from": 0, 
      "size": 3, 
      "query": {
        "match": {
          "desc": "机场酒店"
        }
      }
      , "highlight": {
        "fields": {
          "desc": {}
        }
      }
    }

    9、  短语匹配match_phrase

    与match query类似,但用于匹配精确短语,分词后所有词项都要出现在该字段中,字段中的词项顺序要一致。

    GET bus/_search
    {
      "query": {
        "match_phrase": {
          "name": "公交车122"
        }
      }
    }

    {
      "took" : 4,
      "timed_out" : false,
      "_shards" : {
        "total" : 3,
        "successful" : 3,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 1,
        "max_score" : 3.4102418,
        "hits" : [
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "3",
            "_score" : 3.4102418,
            "_source" : {
              "name" : "公交车122路",
              "desc" : "从前兴路枢纽到东站",
              "price" : 2,
              "producer" : "公交集团",
              "tags" : [
                "单层",
                "空调"
              ]
            }
          }
        ]
      }
    }


    对比match
    GET bus/_search
    {
      "query": {
        "match": {
          "name": "公交车122"
        }
      }
    }

    {
      "took" : 1,
      "timed_out" : false,
      "_shards" : {
        "total" : 3,
        "successful" : 3,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 3,
        "max_score" : 5.3417225,
        "hits" : [
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "2",
            "_score" : 5.3417225,
            "_source" : {
              "name" : "公交车5路",
              "desc" : "从巫家坝到梁家河",
              "price" : 1,
              "producer" : "公交集团",
              "tags" : [
                "双层",
                "普通",
                "热门"
              ]
            }
          },
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "3",
            "_score" : 3.4102418,
            "_source" : {
              "name" : "公交车122路",
              "desc" : "从前兴路枢纽到东站",
              "price" : 2,
              "producer" : "公交集团",
              "tags" : [
                "单层",
                "空调"
              ]
            }
          },
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "1",
            "_score" : 2.1597636,
            "_source" : {
              "name" : "公交车5路",
              "desc" : "从巫家坝到梁家河",
              "price" : 1,
              "producer" : "公交集团",
              "tags" : [
                "双层",
                "普通",
                "热门"
              ]
            }
          }
        ]
      }
    }

    10、短语前缀查询match_phrase_prefix

    match_phrase_prefix与match_phrase相同,只是它允许在文本中的最后一个词的前缀匹配

    GET bus/_search
    {
      "query": {
        "match_phrase_prefix": {
          "name": "公交车1"
        }
      }
    }
    
    {
      "took" : 3,
      "timed_out" : false,
      "_shards" : {
        "total" : 3,
        "successful" : 3,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 1,
        "max_score" : 6.8204837,
        "hits" : [
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "3",
            "_score" : 6.8204837,
            "_source" : {
              "name" : "公交车122路",
              "desc" : "从前兴路枢纽到东站",
              "price" : 2,
              "producer" : "公交集团",
              "tags" : [
                "单层",
                "空调"
              ]
            }
          }
        ]
      }
    }
    
    对比:
    GET bus/_search
    {
      "query": {
        "match_phrase": {
          "name": "公交车1"
        }
      }
    }
    
    {
      "took" : 0,
      "timed_out" : false,
      "_shards" : {
        "total" : 3,
        "successful" : 3,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 0,
        "max_score" : null,
        "hits" : [ ]
      }
    }

    11、 多字段查询multi_match

    GET bus/_search
    {
      "query": {
        "multi_match": {
          "query": "空港",
          "fields": ["desc","name"]
        }
      }
    }
    
    {
      "took" : 1,
      "timed_out" : false,
      "_shards" : {
        "total" : 3,
        "successful" : 3,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 3,
        "max_score" : 3.6836727,
        "hits" : [
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "16",
            "_score" : 3.6836727,
            "_source" : {
              "name" : "机场大巴A2线",
              "desc" : "空港",
              "price" : 21,
              "producer" : "大巴",
              "tags" : [
                "单层",
                "空调",
                "大巴"
              ]
            }
          },
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "18",
            "_score" : 3.5525968,
            "_source" : {
              "name" : "空港大巴A2线",
              "desc" : "机场",
              "price" : 21,
              "producer" : "大巴",
              "tags" : [
                "单层",
                "空调",
                "大巴"
              ]
            }
          },
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "19",
            "_score" : 3.1757839,
            "_source" : {
              "name" : "空港大巴A2线",
              "desc" : "空港快线",
              "price" : 21,
              "producer" : "大巴",
              "tags" : [
                "单层",
                "空调",
                "大巴"
              ]
            }
          }
        ]
      }
    }

    12、范围检索,range查询用于匹配数值型、日期型或字符串型字段在某一范围内的文档。

    GET bus/_search
    {
      "from": 0, 
      "size": 10, 
      "query": {
        "range": {
          "updateDate": {
            "gte": "2018-12-01",
            "lte": "2018-12-31",
    "format": "yyyy-MM-dd" } } } } { "took" : 1, "timed_out" : false, "_shards" : { "total" : 3, "successful" : 3, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 2, "max_score" : 1.0, "hits" : [ { "_index" : "bus", "_type" : "product", "_id" : "13", "_score" : 1.0, "_source" : { "name" : "机场大巴A2线", "desc" : "机机场场", "price" : 21, "producer" : "机场大巴", "tags" : [ "单层", "空调", "大巴" ], "updateDate" : "2018-12-20" } }, { "_index" : "bus", "_type" : "product", "_id" : "12", "_score" : 1.0, "_source" : { "name" : "机场大巴A2线", "desc" : "机机场场", "price" : 21, "producer" : "机场大巴", "tags" : [ "单层", "空调", "大巴" ], "updateDate" : "2018-12-01" } } ] } }

    可以不加索引,表示搜索所有索引。

    GET /_search
    {
      "from": 0, 
      "size": 10, 
      "query": {
        "range": {
          "updateDate": {
            "gte": "2018-12-01",
            "lte": "2018-12-31",
    "format": "yyyy-MM-dd" } } } } { "took" : 14, "timed_out" : false, "_shards" : { "total" : 22, "successful" : 20, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 4, "max_score" : 1.0, "hits" : [ { "_index" : "bus", "_type" : "product", "_id" : "13", "_score" : 1.0, "_source" : { "name" : "机场大巴A2线", "desc" : "机机场场", "price" : 21, "producer" : "机场大巴", "tags" : [ "单层", "空调", "大巴" ], "updateDate" : "2018-12-20" } }, { "_index" : "home", "_type" : "product", "_id" : "3", "_score" : 1.0, "_source" : { "title" : "My first post3", "memo" : "a test23", "updateDate" : "2018-12-13" } }, { "_index" : "bus", "_type" : "product", "_id" : "12", "_score" : 1.0, "_source" : { "name" : "机场大巴A2线", "desc" : "机机场场", "price" : 21, "producer" : "机场大巴", "tags" : [ "单层", "空调", "大巴" ], "updateDate" : "2018-12-01" } }, { "_index" : "home", "_type" : "product", "_id" : "1", "_score" : 1.0, "_source" : { "title" : "My first post2", "memo" : "a test2", "updateDate" : "2018-12-12" } } ] } }

    13、检索字段或者值是否存在,exists查询

    只能返回field字段存在,并且不为null的数据。

    GET /_search
    {
      "query": {
        "exists": {"field": "desc1"}
      }
    }
    
    {
      "took" : 1,
      "timed_out" : false,
      "_shards" : {
        "total" : 22,
        "successful" : 20,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 0,
        "max_score" : null,
        "hits" : [ ]
      }
    }

    13.1 返回索引中没有某个字段的记录

    GET bus/_search
    {
      "from": 0,"size": 1,  
      "query": {
        "bool": {
          "must_not": [
            {
              "exists": {"field": "updateDate"}
            }
          ]
        }
      }
    }
    
    返回记录中缺少updateDate字段或者值为null的
    {
      "took" : 1,
      "timed_out" : false,
      "_shards" : {
        "total" : 3,
        "successful" : 3,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 7,
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "2",
            "_score" : 1.0,
            "_source" : {
              "name" : "公交车5路",
              "desc" : "从巫家坝到梁家河",
              "price" : 1,
              "producer" : "公交集团",
              "tags" : [
                "双层",
                "普通",
                "热门"
              ]
            }
          }
        ]
      }
    }

    13.2 返回存在字段,并且不能为null

    GET bus/_search
    {
      "from": 0,"size": 1,  
      "query": {
        "exists": {"field": "updateDate"}
      }
    }
    或
    GET bus/_search
    {
      "from": 0,"size": 1,
      "query": {
        "bool": {
          "must": [
            {"exists": {"field": "updateDate"}}
          ]
        }
      }
    }
    
    返回记录中有updateDate:
    {
      "took" : 3,
      "timed_out" : false,
      "_shards" : {
        "total" : 3,
        "successful" : 3,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 20,
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "20",
            "_score" : 1.0,
            "_source" : {
              "name" : "空港豪华大巴A2线",
              "desc" : "空港快线",
              "price" : 35,
              "producer" : "大巴",
              "tags" : [
                "单层",
                "空调",
                "大巴",
                "豪华"
              ],
              "updateDate" : "2018-07-20"
            }
          }
        ]
      }
    }

    14、prefix query前缀查询,Matches documents that have fields containing terms with a specified prefix (not analyzed)

    GET _search
    {
      "from": 0, 
      "size": 2, 
      "query": {
        "prefix": {
          "name": "公" #根据分词
        }
      }
    }
    
    {
      "took" : 4,
      "timed_out" : false,
      "_shards" : {
        "total" : 22,
        "successful" : 20,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 3,
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "2",
            "_score" : 1.0,
            "_source" : {
              "name" : "公交车5路",
              "desc" : "从巫家坝到梁家河",
              "price" : 1,
              "producer" : "公交集团",
              "tags" : [
                "双层",
                "普通",
                "热门"
              ],
              "updateDate" : "2018-03-01"
            }
          },
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "1",
            "_score" : 1.0,
            "_source" : {
              "name" : "公交车5路",
              "desc" : "从巫家坝到梁家河",
              "price" : 1,
              "producer" : "公交集团",
              "tags" : [
                "双层",
                "普通",
                "热门"
              ],
              "updateDate" : "2018-02-01"
            }
          }
        ]
      }
    }

    15、wildcard查询(通配符查询)

    支持*和?通配查询.

    GET /_search
    {
        "query": {
            "wildcard" : { "user" : "ki*y" }
        }
    }

    16、regexp查询(正则表达式查询)

    https://www.elastic.co/guide/en/elasticsearch/reference//6.5/query-dsl-regexp-query.html

    17、模糊查询fuzzy query

    https://www.elastic.co/guide/en/elasticsearch/reference/6.5/query-dsl-fuzzy-query.html

    18、ids查询

    GET /_search
    {
      "query": {
        "ids": {
          "type": "product", 
          "values": [1,2]
        }
      }
    }

     19、排序

    19.1 常规排序

    GET bus/_search
    {
      "from": 0, 
      "size": 50, 
      "query": {
        "match_all": {}
      },
      "sort": [
        {
          "updateDate": {
            "order": "desc"
          }
        },
         {
          "price": {
            "order": "desc"
          }
        }
      ]
    }

     19.2 字段多值情况下排序,在字段内容是数组的情况下,排序可以指定按数组的min、max、avg、sum、median等聚合方式来排序

    先把id为13的文档字段updateDate更新成数组
    POST /bus/product/13/_update
    {
      "doc": {"updateDate":["2018-12-20","2018-01-01"]}
    }
    
    如果是多字段,按最小字段排序
    GET /bus/_search
    {
      "from": 0, "size": 100, 
      "query": {
        "match_all": {}
      },
      "sort": [
        {
          "updateDate": {
            "order": "desc",
            "mode": "min"
          }
        }
      ]
    }
    
    返回略:排序按数组中"2018-01-01"来排序

     19.3 无值字段排序,在某些记录没有排序的字段或者字段为null

    GET /_search
    {
        "sort" : [
            { "price" : {"missing" : "_last"} }
        ],
        "query" : {
            "term" : { "product" : "chocolate" }
        }
    }
    缺省情况下是_last排序,可以选择_first排序

    19.4 经纬度排序

    下例中:pin.location是一个经纬度字段(geo_point)

    GET /_search
    {
        "sort" : [
            {
                "_geo_distance" : {
                    "pin.location" : [-70, 40],
                    "order" : "asc",
                    "unit" : "km",
                    "mode" : "min",
                    "distance_type" : "arc",
                    "ignore_unmapped": true
                }
            }
        ],
        "query" : {
            "term" : { "user" : "kimchy" }
        }
    }

    distance_type:计算距离,arc(缺省)或者plane(快,但是不准确)

     20、格式化字段返回值,一般用于时间和数字。

    GET /bus/_search
    {
      "from": 0, "size": 1, 
      "query": {
        "match_all": {}
      },
      "docvalue_fields": [
        {
          "field":"updateDate",
          "format":"yyyy-MM-dd hh:mm:ss"
        },
        {
          "field":"price",
          "format":"0.00"
        }
        ]
    }
    {
      "took" : 0,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 27,
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "bus",
            "_type" : "product",
            "_id" : "20",
            "_score" : 1.0,
            "_source" : {
              "name" : "空港豪华大巴A2线",
              "desc" : "空港快线",
              "price" : 35,
              "producer" : "大巴",
              "tags" : [
                "单层",
                "空调",
                "大巴",
                "豪华"
              ],
              "updateDate" : "2018-07-20"
            },
            "fields" : {
              "updateDate" : [
                "2018-07-20 12:00:00"
              ],
              "price" : [
                "35.00"
              ]
            }
          }
        ]
      }
    }

    21、多条件检索记录filter

    返回名字中包含空港以及价格小于等于21的记录
    GET /bus/_search
    {
      "from": 0,"size": 1,  
      "query": {
        "bool": {
          "filter": [
            {"match":{"name":"空港"}},
            {"range":{"price":{"lte":21}}}
            
          ]
        }
      }
    }
    返回:
    {
      "took" : 1,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 1,
        "max_score" : 0.0,
        "hits" : [
          {
            "_index" : "shirts",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 0.0,
            "_source" : {
              "brand" : "gucci",
              "color" : "red",
              "model" : "slim"
            }
          }
        ]
      }
    }

    22、返回检索计数

    GET /bus/_count
    {
      "query": {
        "match": {
          "name": "空港"
        }
      }
    }
    
    {
      "count" : 9,
      "_shards" : {
        "total" : 3,
        "successful" : 3,
        "skipped" : 0,
        "failed" : 0
      }
    }

    23、解释api, explain api ,用于分析检索语句是否命中

    GET /bus/product/26/_explain
    {
      "query": {
        "match": {
          "name":{
            "operator": "and",
            "query": "空港"
          }
        }
      }
    }
  • 相关阅读:
    redis 配置文件
    mysql的join
    mysql在DOS下的操作
    Echart显示在顶端显示总数
    汇编中,BP,SP有何区别?分别怎么使用?
    汇编函数调用中bp和sp是指什么?
    汇编语言中,SP,BP ,SI,DI作用?
    我对读计算机软件专业硕士的几点看法
    磨刀不误砍柴工
    《自己动手写操作系统》读书笔记——初识保护模式
  • 原文地址:https://www.cnblogs.com/asker009/p/10099890.html
Copyright © 2011-2022 走看看