欢迎您的访问
专注架构,Java,数据结构算法,Python技术分享

Elasticsearch 教程(十六): 索引 API

本章节我们要介绍的这些 API 用于管理索引的所有方面的内容,如设置,别名,映射,索引模板

创建索引

这个 API 可以用来创建索引

当用户将 JSON 对象传递给任何索引时,可以自动创建索引

当然,也可以不传递任何数据,而是使用默认设置创建一个索引

要创建索引,只需要发送带有设置,映射和别名的 HTTP POST 请求,或者只是一个没有正文的简单请求

例如下面的请求使用默认设置创建一个索引

PUT http://localhost:9200/colleges?pretty

返回响应

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "colleges"
}

或者发起请求的时候可以传递一个设置

PUT http://localhost:9200/colleges2?pretty

请求正文

{
    "settings" : {
        "index" : {
            "number_of_shards" : 5, "number_of_replicas" : 3
        }
    }
}

返回响应

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "colleges2"
}

传递的配置中还可以携带映射数据

PUT http://localhost:9200/colleges3?pretty

请求正文

{
    "settings" : {
        "number_of_shards" : 3
    },

   "mappings" : {
        "type1" : {
            "_source" : { "enabled" : false }, 
            "properties" : {
                "college_name" : { "type" : "string" }, 
                "college_type" : {"type":"string"}
            }
        }
    }
}

返回响应

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "colleges3"
}

或创建索引时同时创建别名

PUT http://localhost:9200/colleges4?pretty

请求正文

{
    "aliases" : {
        "alias_1" : {}, 
        "alias_2" : {
            "filter" : {
                "term" : {"user" : "manu" }
            },
            "routing" : "manu"
        }
    }
}

返回响应

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "colleges4"
}

删除索引

发起一个 HTTP DELETE 请求就可以删除某个索引,语法如下

DELETE http://localhost:9200/<index_name>

<index_name> 为想要删除的索引名,例如要删除 colleges4 索引,可以这样

DELETE http://localhost:9200/colleges4

如果想要删除所有的索引,可以使用 _all 关键字,如下

DELETE http://localhost:9200/_all

获取一个索引

发起一个 HTTP GET 请求就可以获取某个索引

语法如下

GET http://localhost:9200/<index_name>

<index_name> 为想要获取的索引名,例如要获取 user_admin 索引,可以这样

GET http://localhost:9200/user_admin

返回响应内容

{
  "user_admin" : {
    "aliases" : { },
    "mappings" : {
      "user" : {
        "properties" : {
          "city" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "description" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "interests" : {
            "type" : "text",
            "fielddata" : true
          },
          "location" : {
            "type" : "float"
          },
          "money" : {
            "type" : "long"
          },
          "nickname" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            },
            "fielddata" : true
          },
          "state" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "street" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "tags" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "vitality" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "zip" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1530187334876",
        "number_of_shards" : "5",
        "number_of_replicas" : "1",
        "uuid" : "_acBr-_YSCiaHImp1VObGg",
        "version" : {
          "created" : "6030099"
        },
        "provided_name" : "user_admin"
      }
    }
  }
}

如果想要获取多个所以,可以使用逗号分隔想要获取的多个索引名,如下

GET http://localhost:9200/user,user_admin

如果想要获取所有的索引,可以使用 _all 关键字或星号 ( * ),如下

GET http://localhost:9200/_all

GET http://localhost:9200/*

判断索引是否存在

判断所以是否存在的方法很简单,只要想那个所以发起一个请求即可,如果返回的响应状态码是 200 则说明存在,如果返回的状态码为 404 则说明不存在

打开或关闭索引

打开或关闭一个索引的方法很简单,只要发起一个 HTTP POST 请求并在 URL 中添加 _close 或 _open 路径参数即可

例如下面的请求用于关闭索引 python

POST http://localhost:9200/python/_close

而打开索引 python 则可以这样

POST http://localhost:9200/python/_open

请求别名

发起一个 HTTP POST 请求并在 URL 中添加 _aliases 路径参数即可为任何索引创建一个别名

单个别名可以映射到多个,但是别名不能和索引名一样

例如

POST http://localhost:9200/_aliases?pretty

请求正文

{
   "actions" : [
      { "add" : { "index" : "user", "alias" : "user_nor" } }
   ]
}

响应内容

{
    "acknowledged": true
}

创建了别名后我们就可以使用别名来获取索引

GET http://localhost:9200/user_nor?pretty

返回内容

{
    "user": {
        "aliases": {
            "user_nor": {}
        },
        "mappings": {
            "user": {
                "properties": {
                    "city": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    },
                    "description": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    },
                    "interests": {
                        "type": "text",
                        "fielddata": true
                    },
                    "location": {
                        "type": "float"
                    },
                    "money": {
                        "type": "long"
                    },
                    "nickname": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        },
                        "fielddata": true
                    },
                    "state": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    },
                    "street": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    },
                    "tags": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    },
                    "vitality": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    },
                    "zip": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    }
                }
            }
        },
        "settings": {
            "index": {
                "creation_date": "1530189785122",
                "number_of_shards": "5",
                "number_of_replicas": "1",
                "uuid": "VYLD0ybxRLeVB_KsJ8ZjDw",
                "version": {
                    "created": "6030099"
                },
                "provided_name": "user"
            }
        }
    }
}

索引设置

通过发送一个 HTTP GET 请求并向 URL 中添加 _settings 路径参数来获取某个索引的设置

GET http://localhost:9200/schools/_settings?pretty

返回响应

{
   "schools":{
      "settings":{
         "index":{
            "creation_date":"1454409831535", "number_of_shards":"5", 
            "number_of_replicas":"1", "uuid":"iKdjTtXQSMCW4xZMhpsOVA", 
            "version":{"created":"2010199"}
        }
      }
   }
}

分析

可以通过向 /_analyze 发起一个 HTTP POST 请求并传递需要分析的文本和分析器类型来分析一段文本

POST http://localhost:9200/_analyze

请求正文

{
   "analyzer" : "standard",
   "text" : "you are reading this at tutorials point"
}

返回响应

{
   "tokens":[
      {"token":"you", "start_offset":0, "end_offset":3, "type":"<ALPHANUM>", "position":0},
      {"token":"are", "start_offset":4, "end_offset":7, "type":"<ALPHANUM>", "position":1},
      {"token":"reading", "start_offset":8, "end_offset":15, "type":"<ALPHANUM>", "position":2},
      {"token":"this", "start_offset":16, "end_offset":20, "type":"<ALPHANUM>", "position":3},
      {"token":"at", "start_offset":21, "end_offset":23, "type":"<ALPHANUM>", "position":4},
      {"token":"tutorials", "start_offset":24, "end_offset":33, "type":"<ALPHANUM>", "position":5},
      {"token":"point", "start_offset":34, "end_offset":39, "type":"<ALPHANUM>", "position":6}
   ]
}

我们也可以通过使用索引来分析文本,Elasticsearch 会使用索引相关联的分析器来分析文本

索引模板

我们可以使用映射来创建一个索引模板,然后可以将该索引模版用于新的索引中

例如

POST http://localhost:9200/_template/template_a?pretty

请求正文

{
    "template" : "tu*", 
      "settings" : {
         "number_of_shards" : 3
    },

    "mappings" : {
      "chapter" : {
         "_source" : { "enabled" : false }
      }
    }
}

这样,任何以 tu 开头的索引都会默认使用 template_a 模板相同的设置

索引统计

可以向某个索引发起一个 HTTP GET 请求并在 URL 中添加 _stats 路径参数来获取某个索引的统计信息

例如

GET http://localhost:9200/user/_stats?pretty

返回响应

{
    "_shards": {
        "total": 10,
        "successful": 5,
        "failed": 0
    },
    "_all": {
        "primaries": {
            "docs": {
                "count": 2,
                "deleted": 0
            },
            "store": {
                "size_in_bytes": 18005
            },
            "indexing": {
                "index_total": 0,
                "index_time_in_millis": 0,
                "index_current": 0,
                "index_failed": 0,
                "delete_total": 0,
                "delete_time_in_millis": 0,
                "delete_current": 0,
                "noop_update_total": 0,
                "is_throttled": false,
                "throttle_time_in_millis": 0
            },
            "get": {
                "total": 1,
                "time_in_millis": 9,
                "exists_total": 1,
                "exists_time_in_millis": 9,
                "missing_total": 0,
                "missing_time_in_millis": 0,
                "current": 0
            },
            "search": {
                "open_contexts": 0,
                "query_total": 55,
                "query_time_in_millis": 434,
                "query_current": 0,
                "fetch_total": 8,
                "fetch_time_in_millis": 6,
                "fetch_current": 0,
                "scroll_total": 0,
                "scroll_time_in_millis": 0,
                "scroll_current": 0,
                "suggest_total": 0,
                "suggest_time_in_millis": 0,
                "suggest_current": 0
            },
            "merges": {
                "current": 0,
                "current_docs": 0,
                "current_size_in_bytes": 0,
                "total": 0,
                "total_time_in_millis": 0,
                "total_docs": 0,
                "total_size_in_bytes": 0,
                "total_stopped_time_in_millis": 0,
                "total_throttled_time_in_millis": 0,
                "total_auto_throttle_in_bytes": 104857600
            },
            "refresh": {
                "total": 15,
                "total_time_in_millis": 0,
                "listeners": 0
            },
            "flush": {
                "total": 5,
                "periodic": 0,
                "total_time_in_millis": 11
            },
            "warmer": {
                "current": 0,
                "total": 5,
                "total_time_in_millis": 0
            },
            "query_cache": {
                "memory_size_in_bytes": 0,
                "total_count": 0,
                "hit_count": 0,
                "miss_count": 0,
                "cache_size": 0,
                "cache_count": 0,
                "evictions": 0
            },
            "fielddata": {
                "memory_size_in_bytes": 756,
                "evictions": 0
            },
            "completion": {
                "size_in_bytes": 0
            },
            "segments": {
                "count": 2,
                "memory_in_bytes": 10114,
                "terms_memory_in_bytes": 7778,
                "stored_fields_memory_in_bytes": 624,
                "term_vectors_memory_in_bytes": 0,
                "norms_memory_in_bytes": 1024,
                "points_memory_in_bytes": 8,
                "doc_values_memory_in_bytes": 680,
                "index_writer_memory_in_bytes": 0,
                "version_map_memory_in_bytes": 0,
                "fixed_bit_set_memory_in_bytes": 0,
                "max_unsafe_auto_id_timestamp": -1,
                "file_sizes": {}
            },
            "translog": {
                "operations": 2,
                "size_in_bytes": 1502,
                "uncommitted_operations": 0,
                "uncommitted_size_in_bytes": 550,
                "earliest_last_modified_age": 0
            },
            "request_cache": {
                "memory_size_in_bytes": 0,
                "evictions": 0,
                "hit_count": 0,
                "miss_count": 0
            },
            "recovery": {
                "current_as_source": 0,
                "current_as_target": 0,
                "throttle_time_in_millis": 0
            }
        },
        "total": {
            "docs": {
                "count": 2,
                "deleted": 0
            },
            "store": {
                "size_in_bytes": 18005
            },
            "indexing": {
                "index_total": 0,
                "index_time_in_millis": 0,
                "index_current": 0,
                "index_failed": 0,
                "delete_total": 0,
                "delete_time_in_millis": 0,
                "delete_current": 0,
                "noop_update_total": 0,
                "is_throttled": false,
                "throttle_time_in_millis": 0
            },
            "get": {
                "total": 1,
                "time_in_millis": 9,
                "exists_total": 1,
                "exists_time_in_millis": 9,
                "missing_total": 0,
                "missing_time_in_millis": 0,
                "current": 0
            },
            "search": {
                "open_contexts": 0,
                "query_total": 55,
                "query_time_in_millis": 434,
                "query_current": 0,
                "fetch_total": 8,
                "fetch_time_in_millis": 6,
                "fetch_current": 0,
                "scroll_total": 0,
                "scroll_time_in_millis": 0,
                "scroll_current": 0,
                "suggest_total": 0,
                "suggest_time_in_millis": 0,
                "suggest_current": 0
            },
            "merges": {
                "current": 0,
                "current_docs": 0,
                "current_size_in_bytes": 0,
                "total": 0,
                "total_time_in_millis": 0,
                "total_docs": 0,
                "total_size_in_bytes": 0,
                "total_stopped_time_in_millis": 0,
                "total_throttled_time_in_millis": 0,
                "total_auto_throttle_in_bytes": 104857600
            },
            "refresh": {
                "total": 15,
                "total_time_in_millis": 0,
                "listeners": 0
            },
            "flush": {
                "total": 5,
                "periodic": 0,
                "total_time_in_millis": 11
            },
            "warmer": {
                "current": 0,
                "total": 5,
                "total_time_in_millis": 0
            },
            "query_cache": {
                "memory_size_in_bytes": 0,
                "total_count": 0,
                "hit_count": 0,
                "miss_count": 0,
                "cache_size": 0,
                "cache_count": 0,
                "evictions": 0
            },
            "fielddata": {
                "memory_size_in_bytes": 756,
                "evictions": 0
            },
            "completion": {
                "size_in_bytes": 0
            },
            "segments": {
                "count": 2,
                "memory_in_bytes": 10114,
                "terms_memory_in_bytes": 7778,
                "stored_fields_memory_in_bytes": 624,
                "term_vectors_memory_in_bytes": 0,
                "norms_memory_in_bytes": 1024,
                "points_memory_in_bytes": 8,
                "doc_values_memory_in_bytes": 680,
                "index_writer_memory_in_bytes": 0,
                "version_map_memory_in_bytes": 0,
                "fixed_bit_set_memory_in_bytes": 0,
                "max_unsafe_auto_id_timestamp": -1,
                "file_sizes": {}
            },
            "translog": {
                "operations": 2,
                "size_in_bytes": 1502,
                "uncommitted_operations": 0,
                "uncommitted_size_in_bytes": 550,
                "earliest_last_modified_age": 0
            },
            "request_cache": {
                "memory_size_in_bytes": 0,
                "evictions": 0,
                "hit_count": 0,
                "miss_count": 0
            },
            "recovery": {
                "current_as_source": 0,
                "current_as_target": 0,
                "throttle_time_in_millis": 0
            }
        }
    },
    "indices": {
        "user": {
            "primaries": {
                "docs": {
                    "count": 2,
                    "deleted": 0
                },
                "store": {
                    "size_in_bytes": 18005
                },
                "indexing": {
                    "index_total": 0,
                    "index_time_in_millis": 0,
                    "index_current": 0,
                    "index_failed": 0,
                    "delete_total": 0,
                    "delete_time_in_millis": 0,
                    "delete_current": 0,
                    "noop_update_total": 0,
                    "is_throttled": false,
                    "throttle_time_in_millis": 0
                },
                "get": {
                    "total": 1,
                    "time_in_millis": 9,
                    "exists_total": 1,
                    "exists_time_in_millis": 9,
                    "missing_total": 0,
                    "missing_time_in_millis": 0,
                    "current": 0
                },
                "search": {
                    "open_contexts": 0,
                    "query_total": 55,
                    "query_time_in_millis": 434,
                    "query_current": 0,
                    "fetch_total": 8,
                    "fetch_time_in_millis": 6,
                    "fetch_current": 0,
                    "scroll_total": 0,
                    "scroll_time_in_millis": 0,
                    "scroll_current": 0,
                    "suggest_total": 0,
                    "suggest_time_in_millis": 0,
                    "suggest_current": 0
                },
                "merges": {
                    "current": 0,
                    "current_docs": 0,
                    "current_size_in_bytes": 0,
                    "total": 0,
                    "total_time_in_millis": 0,
                    "total_docs": 0,
                    "total_size_in_bytes": 0,
                    "total_stopped_time_in_millis": 0,
                    "total_throttled_time_in_millis": 0,
                    "total_auto_throttle_in_bytes": 104857600
                },
                "refresh": {
                    "total": 15,
                    "total_time_in_millis": 0,
                    "listeners": 0
                },
                "flush": {
                    "total": 5,
                    "periodic": 0,
                    "total_time_in_millis": 11
                },
                "warmer": {
                    "current": 0,
                    "total": 5,
                    "total_time_in_millis": 0
                },
                "query_cache": {
                    "memory_size_in_bytes": 0,
                    "total_count": 0,
                    "hit_count": 0,
                    "miss_count": 0,
                    "cache_size": 0,
                    "cache_count": 0,
                    "evictions": 0
                },
                "fielddata": {
                    "memory_size_in_bytes": 756,
                    "evictions": 0
                },
                "completion": {
                    "size_in_bytes": 0
                },
                "segments": {
                    "count": 2,
                    "memory_in_bytes": 10114,
                    "terms_memory_in_bytes": 7778,
                    "stored_fields_memory_in_bytes": 624,
                    "term_vectors_memory_in_bytes": 0,
                    "norms_memory_in_bytes": 1024,
                    "points_memory_in_bytes": 8,
                    "doc_values_memory_in_bytes": 680,
                    "index_writer_memory_in_bytes": 0,
                    "version_map_memory_in_bytes": 0,
                    "fixed_bit_set_memory_in_bytes": 0,
                    "max_unsafe_auto_id_timestamp": -1,
                    "file_sizes": {}
                },
                "translog": {
                    "operations": 2,
                    "size_in_bytes": 1502,
                    "uncommitted_operations": 0,
                    "uncommitted_size_in_bytes": 550,
                    "earliest_last_modified_age": 0
                },
                "request_cache": {
                    "memory_size_in_bytes": 0,
                    "evictions": 0,
                    "hit_count": 0,
                    "miss_count": 0
                },
                "recovery": {
                    "current_as_source": 0,
                    "current_as_target": 0,
                    "throttle_time_in_millis": 0
                }
            },
            "total": {
                "docs": {
                    "count": 2,
                    "deleted": 0
                },
                "store": {
                    "size_in_bytes": 18005
                },
                "indexing": {
                    "index_total": 0,
                    "index_time_in_millis": 0,
                    "index_current": 0,
                    "index_failed": 0,
                    "delete_total": 0,
                    "delete_time_in_millis": 0,
                    "delete_current": 0,
                    "noop_update_total": 0,
                    "is_throttled": false,
                    "throttle_time_in_millis": 0
                },
                "get": {
                    "total": 1,
                    "time_in_millis": 9,
                    "exists_total": 1,
                    "exists_time_in_millis": 9,
                    "missing_total": 0,
                    "missing_time_in_millis": 0,
                    "current": 0
                },
                "search": {
                    "open_contexts": 0,
                    "query_total": 55,
                    "query_time_in_millis": 434,
                    "query_current": 0,
                    "fetch_total": 8,
                    "fetch_time_in_millis": 6,
                    "fetch_current": 0,
                    "scroll_total": 0,
                    "scroll_time_in_millis": 0,
                    "scroll_current": 0,
                    "suggest_total": 0,
                    "suggest_time_in_millis": 0,
                    "suggest_current": 0
                },
                "merges": {
                    "current": 0,
                    "current_docs": 0,
                    "current_size_in_bytes": 0,
                    "total": 0,
                    "total_time_in_millis": 0,
                    "total_docs": 0,
                    "total_size_in_bytes": 0,
                    "total_stopped_time_in_millis": 0,
                    "total_throttled_time_in_millis": 0,
                    "total_auto_throttle_in_bytes": 104857600
                },
                "refresh": {
                    "total": 15,
                    "total_time_in_millis": 0,
                    "listeners": 0
                },
                "flush": {
                    "total": 5,
                    "periodic": 0,
                    "total_time_in_millis": 11
                },
                "warmer": {
                    "current": 0,
                    "total": 5,
                    "total_time_in_millis": 0
                },
                "query_cache": {
                    "memory_size_in_bytes": 0,
                    "total_count": 0,
                    "hit_count": 0,
                    "miss_count": 0,
                    "cache_size": 0,
                    "cache_count": 0,
                    "evictions": 0
                },
                "fielddata": {
                    "memory_size_in_bytes": 756,
                    "evictions": 0
                },
                "completion": {
                    "size_in_bytes": 0
                },
                "segments": {
                    "count": 2,
                    "memory_in_bytes": 10114,
                    "terms_memory_in_bytes": 7778,
                    "stored_fields_memory_in_bytes": 624,
                    "term_vectors_memory_in_bytes": 0,
                    "norms_memory_in_bytes": 1024,
                    "points_memory_in_bytes": 8,
                    "doc_values_memory_in_bytes": 680,
                    "index_writer_memory_in_bytes": 0,
                    "version_map_memory_in_bytes": 0,
                    "fixed_bit_set_memory_in_bytes": 0,
                    "max_unsafe_auto_id_timestamp": -1,
                    "file_sizes": {}
                },
                "translog": {
                    "operations": 2,
                    "size_in_bytes": 1502,
                    "uncommitted_operations": 0,
                    "uncommitted_size_in_bytes": 550,
                    "earliest_last_modified_age": 0
                },
                "request_cache": {
                    "memory_size_in_bytes": 0,
                    "evictions": 0,
                    "hit_count": 0,
                    "miss_count": 0
                },
                "recovery": {
                    "current_as_source": 0,
                    "current_as_target": 0,
                    "throttle_time_in_millis": 0
                }
            }
        }
    }
}

刷新索引缓冲区

刷新索引缓冲区指的是清除索引内存中的数据并将其迁移到索引存储,并清除内部事务日志

刷新索引缓冲区的方法很简单,只要向一个索引发起一个 HTTP GET 请求并在 URL 中添加 _flush 路径参数即可

例如

GET http://localhost:9200/user/_flush?pretty

返回响应

{
    "_shards": {
        "total": 10,
        "successful": 5,
        "failed": 0
    }
}

刷新索引

Elasticsearch 默认内置了刷新机制

当然我们也可以手动显式刷新索引

方法就是向一个索引发起一个 HTTP GET 请求并在 URL 中添加 _refresh 路径参数即可

例如

GET http://localhost:9200/user/_refresh?pretty

返回内容

{
    "_shards": {
        "total": 10,
        "successful": 5,
        "failed": 0
    }
}
赞(1) 打赏
版权归原创作者所有,任何形式转载请联系作者;码农code之路 » Elasticsearch 教程(十六): 索引 API

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏