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": "空港"
      }
    }
  }
}

 

posted @ 2018-12-10 23:15  我是属车的  阅读(470)  评论(0编辑  收藏  举报