• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

ElasticSearch全文搜索单词搜索、多次搜索、组合搜索和权重搜索

武飞扬头像
IT之一小佬
帮助1

全文搜索两个最重要的方面是:

  • 相关性(Relevance) 它是评价查询与其结果间的相关程度,并根据这种相关程度对结果排名的一种能力,这种计算方式可以是 TF/IDF 方法、地理位置邻近、模糊相似,或其他的某些算法。
  • 分词(Analysis) 它是将文本块转换为有区别的、规范化的 token 的一个过程,目的是为了创建倒排索引以及 查询倒排索引。

一、构造数据

1、数据库中当前数据

学新通

 2、构建索引

  1.  
    PUT http://127.0.0.1:9200/study
  2.  
     
  3.  
    # 请求数据
  4.  
    {
  5.  
    "settings": {
  6.  
    "index": {
  7.  
    "number_of_shards": "1",
  8.  
    "number_of_replicas": "0"
  9.  
    }
  10.  
    },
  11.  
    "mappings": {
  12.  
    "properties": {
  13.  
    "name": {
  14.  
    "type": "text"
  15.  
    },
  16.  
    "age": {
  17.  
    "type": "integer"
  18.  
    },
  19.  
    "mail": {
  20.  
    "type": "keyword"
  21.  
    },
  22.  
    "hobby": {
  23.  
    "type": "text",
  24.  
    "analyzer": "ik_max_word"
  25.  
    }
  26.  
    }
  27.  
    }
  28.  
    }
  29.  
     
  30.  
    # 响应数据
  31.  
    {
  32.  
    "acknowledged": true,
  33.  
    "shards_acknowledged": true,
  34.  
    "index": "study"
  35.  
    }
学新通

学新通

学新通

3、添加数据

  1.  
    POST http://127.0.0.1:9200/study/_bulk
  2.  
     
  3.  
    # 请求数据
  4.  
    {"index":{"_index":"study"}}
  5.  
    {"name":"张三","age": 20,"mail": "111@qq.com","hobby":"羽毛球、乒乓球、足球"}
  6.  
    {"index":{"_index":"study"}}
  7.  
    {"name":"李四","age": 21,"mail": "222@qq.com","hobby":"羽毛球、乒乓球、足球、篮球"}
  8.  
    {"index":{"_index":"study"}}
  9.  
    {"name":"王五","age": 22,"mail": "333@qq.com","hobby":"羽毛球、篮球、游泳、听音乐"}
  10.  
    {"index":{"_index":"study"}}
  11.  
    {"name":"赵六","age": 23,"mail": "444@qq.com","hobby":"跑步、游泳"}
  12.  
    {"index":{"_index":"study"}}
  13.  
    {"name":"孙七","age": 24,"mail": "555@qq.com","hobby":"听音乐、看电影"}
  14.  
     
  15.  
    # 响应数据
  16.  
    {
  17.  
    "took": 16,
  18.  
    "errors": false,
  19.  
    "items": [
  20.  
    {
  21.  
    "index": {
  22.  
    "_index": "study",
  23.  
    "_type": "_doc",
  24.  
    "_id": "i6jJdoIBU4c5cKp3GGKx",
  25.  
    "_version": 1,
  26.  
    "result": "created",
  27.  
    "_shards": {
  28.  
    "total": 1,
  29.  
    "successful": 1,
  30.  
    "failed": 0
  31.  
    },
  32.  
    "_seq_no": 0,
  33.  
    "_primary_term": 1,
  34.  
    "status": 201
  35.  
    }
  36.  
    },
  37.  
    {
  38.  
    "index": {
  39.  
    "_index": "study",
  40.  
    "_type": "_doc",
  41.  
    "_id": "jKjJdoIBU4c5cKp3GGKx",
  42.  
    "_version": 1,
  43.  
    "result": "created",
  44.  
    "_shards": {
  45.  
    "total": 1,
  46.  
    "successful": 1,
  47.  
    "failed": 0
  48.  
    },
  49.  
    "_seq_no": 1,
  50.  
    "_primary_term": 1,
  51.  
    "status": 201
  52.  
    }
  53.  
    },
  54.  
    {
  55.  
    "index": {
  56.  
    "_index": "study",
  57.  
    "_type": "_doc",
  58.  
    "_id": "jajJdoIBU4c5cKp3GGKx",
  59.  
    "_version": 1,
  60.  
    "result": "created",
  61.  
    "_shards": {
  62.  
    "total": 1,
  63.  
    "successful": 1,
  64.  
    "failed": 0
  65.  
    },
  66.  
    "_seq_no": 2,
  67.  
    "_primary_term": 1,
  68.  
    "status": 201
  69.  
    }
  70.  
    },
  71.  
    {
  72.  
    "index": {
  73.  
    "_index": "study",
  74.  
    "_type": "_doc",
  75.  
    "_id": "jqjJdoIBU4c5cKp3GGKx",
  76.  
    "_version": 1,
  77.  
    "result": "created",
  78.  
    "_shards": {
  79.  
    "total": 1,
  80.  
    "successful": 1,
  81.  
    "failed": 0
  82.  
    },
  83.  
    "_seq_no": 3,
  84.  
    "_primary_term": 1,
  85.  
    "status": 201
  86.  
    }
  87.  
    },
  88.  
    {
  89.  
    "index": {
  90.  
    "_index": "study",
  91.  
    "_type": "_doc",
  92.  
    "_id": "j6jJdoIBU4c5cKp3GGKx",
  93.  
    "_version": 1,
  94.  
    "result": "created",
  95.  
    "_shards": {
  96.  
    "total": 1,
  97.  
    "successful": 1,
  98.  
    "failed": 0
  99.  
    },
  100.  
    "_seq_no": 4,
  101.  
    "_primary_term": 1,
  102.  
    "status": 201
  103.  
    }
  104.  
    }
  105.  
    ]
  106.  
    }
学新通

学新通

二、全文搜索

2.1、单词搜索

  1.  
    POST http://127.0.0.1:9200/study/_search
  2.  
     
  3.  
    # 请求数据
  4.  
    {
  5.  
    "query": {
  6.  
    "match": {
  7.  
    "hobby": "音乐"
  8.  
    }
  9.  
    },
  10.  
    "highlight": {
  11.  
    "fields": {
  12.  
    "hobby": {}
  13.  
    }
  14.  
    }
  15.  
    }
  16.  
     
  17.  
    # 响应数据
  18.  
    {
  19.  
    "took": 67,
  20.  
    "timed_out": false,
  21.  
    "_shards": {
  22.  
    "total": 1,
  23.  
    "successful": 1,
  24.  
    "skipped": 0,
  25.  
    "failed": 0
  26.  
    },
  27.  
    "hits": {
  28.  
    "total": {
  29.  
    "value": 2,
  30.  
    "relation": "eq"
  31.  
    },
  32.  
    "max_score": 0.9395274,
  33.  
    "hits": [
  34.  
    {
  35.  
    "_index": "study",
  36.  
    "_type": "_doc",
  37.  
    "_id": "j6jJdoIBU4c5cKp3GGKx",
  38.  
    "_score": 0.9395274,
  39.  
    "_source": {
  40.  
    "name": "孙七",
  41.  
    "age": 24,
  42.  
    "mail": "555@qq.com",
  43.  
    "hobby": "听音乐、看电影"
  44.  
    },
  45.  
    "highlight": {
  46.  
    "hobby": [
  47.  
    "听<em>音乐</em>、看电影"
  48.  
    ]
  49.  
    }
  50.  
    },
  51.  
    {
  52.  
    "_index": "study",
  53.  
    "_type": "_doc",
  54.  
    "_id": "jajJdoIBU4c5cKp3GGKx",
  55.  
    "_score": 0.77041256,
  56.  
    "_source": {
  57.  
    "name": "王五",
  58.  
    "age": 22,
  59.  
    "mail": "333@qq.com",
  60.  
    "hobby": "羽毛球、篮球、游泳、听音乐"
  61.  
    },
  62.  
    "highlight": {
  63.  
    "hobby": [
  64.  
    "羽毛球、篮球、游泳、听<em>音乐</em>"
  65.  
    ]
  66.  
    }
  67.  
    }
  68.  
    ]
  69.  
    }
  70.  
    }
学新通

学新通

过程说明:

1. 检查字段类型

        爱好 hobby 字段是一个 text 类型( 指定了IK分词器),这意味着查询字符串本身也应该被分词。

2. 分析查询字符串 。

        将查询的字符串 “音乐” 传入IK分词器中,输出的结果是单个项 音乐。因为只有一个单词项,所以 match 查询执 行的是单个底层 term 查询。

3. 查找匹配文档 。

        用 term 查询在倒排索引中查找 “音乐” 然后获取一组包含该项的文档,本例的结果是文档:3 、5 。

4. 为每个文档评分 。

        用 term 查询计算每个文档相关度评分 _score ,这是种将 词频(term frequency,即词 “音乐” 在相关文档的 hobby 字段中出现的频率)和 反向文档频率(inverse document frequency,即词 “音乐” 在所有文档的 hobby 字段中出现的频率),以及字段的长度(即字段越短相关度越高)相结合的计算方式。

2.2、单词搜索

  1.  
    POST http://127.0.0.1:9200/study/_search
  2.  
     
  3.  
    # 请求数据
  4.  
    {
  5.  
    "query": {
  6.  
    "match": {
  7.  
    "hobby": "音乐 篮球"
  8.  
    }
  9.  
    },
  10.  
    "highlight": {
  11.  
    "fields": {
  12.  
    "hobby": {}
  13.  
    }
  14.  
    }
  15.  
    }
  16.  
     
  17.  
    # 响应数据
  18.  
    {
  19.  
    "took": 22,
  20.  
    "timed_out": false,
  21.  
    "_shards": {
  22.  
    "total": 1,
  23.  
    "successful": 1,
  24.  
    "skipped": 0,
  25.  
    "failed": 0
  26.  
    },
  27.  
    "hits": {
  28.  
    "total": {
  29.  
    "value": 3,
  30.  
    "relation": "eq"
  31.  
    },
  32.  
    "max_score": 1.5408251,
  33.  
    "hits": [
  34.  
    {
  35.  
    "_index": "study",
  36.  
    "_type": "_doc",
  37.  
    "_id": "jajJdoIBU4c5cKp3GGKx",
  38.  
    "_score": 1.5408251,
  39.  
    "_source": {
  40.  
    "name": "王五",
  41.  
    "age": 22,
  42.  
    "mail": "333@qq.com",
  43.  
    "hobby": "羽毛球、篮球、游泳、听音乐"
  44.  
    },
  45.  
    "highlight": {
  46.  
    "hobby": [
  47.  
    "羽毛球、<em>篮球</em>、游泳、听<em>音乐</em>"
  48.  
    ]
  49.  
    }
  50.  
    },
  51.  
    {
  52.  
    "_index": "study",
  53.  
    "_type": "_doc",
  54.  
    "_id": "j6jJdoIBU4c5cKp3GGKx",
  55.  
    "_score": 0.9395274,
  56.  
    "_source": {
  57.  
    "name": "孙七",
  58.  
    "age": 24,
  59.  
    "mail": "555@qq.com",
  60.  
    "hobby": "听音乐、看电影"
  61.  
    },
  62.  
    "highlight": {
  63.  
    "hobby": [
  64.  
    "听<em>音乐</em>、看电影"
  65.  
    ]
  66.  
    }
  67.  
    },
  68.  
    {
  69.  
    "_index": "study",
  70.  
    "_type": "_doc",
  71.  
    "_id": "jKjJdoIBU4c5cKp3GGKx",
  72.  
    "_score": 0.77041256,
  73.  
    "_source": {
  74.  
    "name": "李四",
  75.  
    "age": 21,
  76.  
    "mail": "222@qq.com",
  77.  
    "hobby": "羽毛球、乒乓球、足球、篮球"
  78.  
    },
  79.  
    "highlight": {
  80.  
    "hobby": [
  81.  
    "羽毛球、乒乓球、足球、<em>篮球</em>"
  82.  
    ]
  83.  
    }
  84.  
    }
  85.  
    ]
  86.  
    }
  87.  
    }
学新通

学新通

        上面查询中只要是包含篮球和音乐的都被查询出来了。但是这有时候不能达到我们的要求,我们大部分时候都是希望两个词是同时包含的。这时候可以使用elasticsearch中指定词之间逻辑关系operator:"and"

  1.  
    POST http://127.0.0.1:9200/study/_search
  2.  
     
  3.  
    # 请求数据
  4.  
    {
  5.  
    "query": {
  6.  
    "match": {
  7.  
    "hobby": {
  8.  
    "query": "音乐 篮球",
  9.  
    "operator": "and"
  10.  
    }
  11.  
    }
  12.  
    },
  13.  
    "highlight": {
  14.  
    "fields": {
  15.  
    "hobby": {}
  16.  
    }
  17.  
    }
  18.  
    }
  19.  
     
  20.  
    # 响应结果
  21.  
    {
  22.  
    "took": 6,
  23.  
    "timed_out": false,
  24.  
    "_shards": {
  25.  
    "total": 1,
  26.  
    "successful": 1,
  27.  
    "skipped": 0,
  28.  
    "failed": 0
  29.  
    },
  30.  
    "hits": {
  31.  
    "total": {
  32.  
    "value": 1,
  33.  
    "relation": "eq"
  34.  
    },
  35.  
    "max_score": 1.5408251,
  36.  
    "hits": [
  37.  
    {
  38.  
    "_index": "study",
  39.  
    "_type": "_doc",
  40.  
    "_id": "jajJdoIBU4c5cKp3GGKx",
  41.  
    "_score": 1.5408251,
  42.  
    "_source": {
  43.  
    "name": "王五",
  44.  
    "age": 22,
  45.  
    "mail": "333@qq.com",
  46.  
    "hobby": "羽毛球、篮球、游泳、听音乐"
  47.  
    },
  48.  
    "highlight": {
  49.  
    "hobby": [
  50.  
    "羽毛球、<em>篮球</em>、游泳、听<em>音乐</em>"
  51.  
    ]
  52.  
    }
  53.  
    }
  54.  
    ]
  55.  
    }
  56.  
    }
学新通

学新通

        上面的测试结果都是选择了"and"和"or"两个极端情况下,但是在真正搜索中,我们不会使用这两个极端情况的,这样就需要另外一种查询方式,即为只需要符合一定的相似度就可以查询到的数据,在elasticsearch中就支持这种查询方式,如使用minimum_should_match来指定匹配度,如60%。

  1.  
    POST http://127.0.0.1:9200/study/_search
  2.  
     
  3.  
    # 请求数据
  4.  
    {
  5.  
    "query": {
  6.  
    "match": {
  7.  
    "hobby": {
  8.  
    "query": "游泳 羽毛球",
  9.  
    "minimum_should_match": "80%"
  10.  
    }
  11.  
    }
  12.  
    },
  13.  
    "highlight": {
  14.  
    "fields": {
  15.  
    "hobby": {}
  16.  
    }
  17.  
    }
  18.  
    }
  19.  
     
  20.  
    # 响应数据
  21.  
    {
  22.  
    "took": 6,
  23.  
    "timed_out": false,
  24.  
    "_shards": {
  25.  
    "total": 1,
  26.  
    "successful": 1,
  27.  
    "skipped": 0,
  28.  
    "failed": 0
  29.  
    },
  30.  
    "hits": {
  31.  
    "total": {
  32.  
    "value": 3,
  33.  
    "relation": "eq"
  34.  
    },
  35.  
    "max_score": 2.1933634,
  36.  
    "hits": [
  37.  
    {
  38.  
    "_index": "study",
  39.  
    "_type": "_doc",
  40.  
    "_id": "jajJdoIBU4c5cKp3GGKx",
  41.  
    "_score": 2.1933634,
  42.  
    "_source": {
  43.  
    "name": "王五",
  44.  
    "age": 22,
  45.  
    "mail": "333@qq.com",
  46.  
    "hobby": "羽毛球、篮球、游泳、听音乐"
  47.  
    },
  48.  
    "highlight": {
  49.  
    "hobby": [
  50.  
    "<em>羽毛球</em>、篮球、<em>游泳</em>、听音乐"
  51.  
    ]
  52.  
    }
  53.  
    },
  54.  
    {
  55.  
    "_index": "study",
  56.  
    "_type": "_doc",
  57.  
    "_id": "i6jJdoIBU4c5cKp3GGKx",
  58.  
    "_score": 1.7171206,
  59.  
    "_source": {
  60.  
    "name": "张三",
  61.  
    "age": 20,
  62.  
    "mail": "111@qq.com",
  63.  
    "hobby": "羽毛球、乒乓球、足球"
  64.  
    },
  65.  
    "highlight": {
  66.  
    "hobby": [
  67.  
    "<em>羽毛球</em>、乒乓<em>球</em>、足球"
  68.  
    ]
  69.  
    }
  70.  
    },
  71.  
    {
  72.  
    "_index": "study",
  73.  
    "_type": "_doc",
  74.  
    "_id": "jKjJdoIBU4c5cKp3GGKx",
  75.  
    "_score": 1.6262295,
  76.  
    "_source": {
  77.  
    "name": "李四",
  78.  
    "age": 21,
  79.  
    "mail": "222@qq.com",
  80.  
    "hobby": "羽毛球、乒乓球、足球、篮球"
  81.  
    },
  82.  
    "highlight": {
  83.  
    "hobby": [
  84.  
    "<em>羽毛球</em>、乒乓<em>球</em>、足球、篮球"
  85.  
    ]
  86.  
    }
  87.  
    }
  88.  
    ]
  89.  
    }
  90.  
    }
学新通

学新通

2.3、组合搜索

        在搜索时除了上面的方法外,还可以使用过滤器中的bool组合搜索。

  1.  
    POST http://127.0.0.1:9200/study/_search
  2.  
     
  3.  
    # 请求数据
  4.  
    {
  5.  
    "query": {
  6.  
    "bool": {
  7.  
    "must": {
  8.  
    "match": {
  9.  
    "hobby": "篮球"
  10.  
    }
  11.  
    },
  12.  
    "must_not": {
  13.  
    "match": {
  14.  
    "hobby": "音乐"
  15.  
    }
  16.  
    },
  17.  
    "should": [
  18.  
    {
  19.  
    "match": {
  20.  
    "hobby": "游泳"
  21.  
    }
  22.  
    }
  23.  
    ]
  24.  
    }
  25.  
    },
  26.  
    "highlight": {
  27.  
    "fields": {
  28.  
    "hobby": {}
  29.  
    }
  30.  
    }
  31.  
    }
  32.  
     
  33.  
    # 响应数据
  34.  
    {
  35.  
    "took": 6,
  36.  
    "timed_out": false,
  37.  
    "_shards": {
  38.  
    "total": 1,
  39.  
    "successful": 1,
  40.  
    "skipped": 0,
  41.  
    "failed": 0
  42.  
    },
  43.  
    "hits": {
  44.  
    "total": {
  45.  
    "value": 1,
  46.  
    "relation": "eq"
  47.  
    },
  48.  
    "max_score": 0.77041256,
  49.  
    "hits": [
  50.  
    {
  51.  
    "_index": "study",
  52.  
    "_type": "_doc",
  53.  
    "_id": "jKjJdoIBU4c5cKp3GGKx",
  54.  
    "_score": 0.77041256,
  55.  
    "_source": {
  56.  
    "name": "李四",
  57.  
    "age": 21,
  58.  
    "mail": "222@qq.com",
  59.  
    "hobby": "羽毛球、乒乓球、足球、篮球"
  60.  
    },
  61.  
    "highlight": {
  62.  
    "hobby": [
  63.  
    "羽毛球、乒乓球、足球、<em>篮球</em>"
  64.  
    ]
  65.  
    }
  66.  
    }
  67.  
    ]
  68.  
    }
  69.  
    }
学新通

注意:上面示例中在搜索结果中必须包含篮球,不能包含音乐,如果包含了游泳,那么它的相似度更高。

评分的计算规则

  • bool 查询会为每个文档计算相关度评分 _score , 再将所有匹配的 must 和 should 语句的分数 _score 求和, 最后除以 must 和 should 语句的总数。
  • must_not 语句不会影响评分; 它的作用只是将不相关的文档排除。

注意:默认情况下,should中的内容不是必须匹配的,如果查询语句中没有must,那么就会至少匹配其中一个。当然了, 也可以通过minimum_should_match参数进行控制,该值可以是数字也可以的百分比。

  1.  
    POST http://127.0.0.1:9200/study/_search
  2.  
     
  3.  
    # 请求数据
  4.  
    {
  5.  
    "query": {
  6.  
    "bool": {
  7.  
    "should": [
  8.  
    {
  9.  
    "match": {
  10.  
    "hobby": "游泳"
  11.  
    }
  12.  
    },
  13.  
    {
  14.  
    "match": {
  15.  
    "hobby": "篮球"
  16.  
    }
  17.  
    },
  18.  
    {
  19.  
    "match": {
  20.  
    "hobby": "音乐"
  21.  
    }
  22.  
    }
  23.  
    ],
  24.  
    "minimum_should_match": 2
  25.  
    }
  26.  
    },
  27.  
    "highlight": {
  28.  
    "fields": {
  29.  
    "hobby": {}
  30.  
    }
  31.  
    }
  32.  
    }
  33.  
     
  34.  
    # 响应数据
  35.  
    {
  36.  
    "took": 4,
  37.  
    "timed_out": false,
  38.  
    "_shards": {
  39.  
    "total": 1,
  40.  
    "successful": 1,
  41.  
    "skipped": 0,
  42.  
    "failed": 0
  43.  
    },
  44.  
    "hits": {
  45.  
    "total": {
  46.  
    "value": 1,
  47.  
    "relation": "eq"
  48.  
    },
  49.  
    "max_score": 2.3112378,
  50.  
    "hits": [
  51.  
    {
  52.  
    "_index": "study",
  53.  
    "_type": "_doc",
  54.  
    "_id": "jajJdoIBU4c5cKp3GGKx",
  55.  
    "_score": 2.3112378,
  56.  
    "_source": {
  57.  
    "name": "王五",
  58.  
    "age": 22,
  59.  
    "mail": "333@qq.com",
  60.  
    "hobby": "羽毛球、篮球、游泳、听音乐"
  61.  
    },
  62.  
    "highlight": {
  63.  
    "hobby": [
  64.  
    "羽毛球、<em>篮球</em>、<em>游泳</em>、听<em>音乐</em>"
  65.  
    ]
  66.  
    }
  67.  
    }
  68.  
    ]
  69.  
    }
  70.  
    }
学新通

学新通

2.4、权重搜索

        在一些情况下,可能会对某些词增加权重来影响该条数据的得分。

  1.  
    POST http://127.0.0.1:9200/study/_search
  2.  
     
  3.  
    # 请求数据
  4.  
    {
  5.  
    "query": {
  6.  
    "bool": {
  7.  
    "must": {
  8.  
    "match": {
  9.  
    "hobby": {
  10.  
    "query": "游泳篮球",
  11.  
    "operator": "and"
  12.  
    }
  13.  
    }
  14.  
    },
  15.  
    "should": [
  16.  
    {
  17.  
    "match": {
  18.  
    "hobby": {
  19.  
    "query": "音乐",
  20.  
    "boost": 10
  21.  
    }
  22.  
    }
  23.  
    },
  24.  
    {
  25.  
    "match": {
  26.  
    "hobby": {
  27.  
    "query": "跑步",
  28.  
    "boost": 2
  29.  
    }
  30.  
    }
  31.  
    }
  32.  
    ]
  33.  
    }
  34.  
    },
  35.  
    "highlight": {
  36.  
    "fields": {
  37.  
    "hobby": {}
  38.  
    }
  39.  
    }
  40.  
    }
  41.  
     
  42.  
    # 响应数据
  43.  
    {
  44.  
    "took": 5,
  45.  
    "timed_out": false,
  46.  
    "_shards": {
  47.  
    "total": 1,
  48.  
    "successful": 1,
  49.  
    "skipped": 0,
  50.  
    "failed": 0
  51.  
    },
  52.  
    "hits": {
  53.  
    "total": {
  54.  
    "value": 1,
  55.  
    "relation": "eq"
  56.  
    },
  57.  
    "max_score": 9.24495,
  58.  
    "hits": [
  59.  
    {
  60.  
    "_index": "study",
  61.  
    "_type": "_doc",
  62.  
    "_id": "jajJdoIBU4c5cKp3GGKx",
  63.  
    "_score": 9.24495,
  64.  
    "_source": {
  65.  
    "name": "王五",
  66.  
    "age": 22,
  67.  
    "mail": "333@qq.com",
  68.  
    "hobby": "羽毛球、篮球、游泳、听音乐"
  69.  
    },
  70.  
    "highlight": {
  71.  
    "hobby": [
  72.  
    "羽毛球、<em>篮球</em>、<em>游泳</em>、听<em>音乐</em>"
  73.  
    ]
  74.  
    }
  75.  
    }
  76.  
    ]
  77.  
    }
  78.  
    }
学新通

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfjehif
系列文章
更多 icon
同类精品
更多 icon
继续加载