大数据搜索与挖掘及可视化管理方案 :Elastic Stack 5:Elasticsearch、Logstash、Kibana、X-Pack、Beats (第3版)
上QQ阅读APP看书,第一时间看更新

3.5 实例

前面给出了全文检索、词项检索等数据检索方法,并介绍了metric aggregations、bucket aggregations等聚合方法。通过这些方法,可以对索引库中的数据集进行检索并统计特定数据。下面的实例是对采集的手机产品库数据集的相关检索与聚合,这些数据是利用定制网络爬虫取得的,之后通过一定的方法建立索引完成入库(利用Java采集数据存入Elasticsearch的过程详见本书后续章节)。数据集的描述如下:

    _index: yesky            //针对天极手机产品库数据的索引文件名称
    _type: cellphone         //针对天极手机产品库数据的类型文件名称
    _id: xxx                 //id号
    _version: x              //版本号
    _score: x                //排序分值
    _source: {               //数据字段描述(内容略)
        url:(略)             //网址,如http://product.yesky.com/product/877/877594/
        phoneName: (略)      //手机名称和型号
        launchDate: (略)     //上市日期
        screenSize: (略)     //主屏幕尺寸(英寸)
        resolution: (略)     //屏幕分辨率
        processor: (略)      //处理器名称
        battery: (略)        //电池容量(毫安时)
        ram: (略)            //运行内存容量(GB)
        rom: (略)            //机身存储容量(GB)
        backCamera: (略)     //主摄像头像素(万)
        frontCamera: (略)    //前摄像头像素(万)
    }

首先在Elasticsearch中建立索引,在head工具的Web前端界面中,跳转至“复合查询”界面。在左侧“查询”窗口第一行填写Elasticsearch的URL地址即http://localhost:9200;第二行填写要创建的索引名称即yesky,在右侧选择PUT方式;在第三行多行文本框输入创建索引的语句,如代码段3.52所示,按下“验证JSON”按钮,经验证无误后即可提交请求。设置mappings成功后使用Java程序将在线数据采集至Elasticsearch中即可。

    //代码段3.52: yesky索引设置 mappings    
    curl-XPUT localhost:9200/whale/_mapping/cellphone-d'{       //注意这里使用PUT方法
      "mappings": {
        "cellphone": {                                          //创建cellphone类型
            "properties": {
              "url": {
                "type": "keyword"
              },
              "phoneName": {
                "type": "text",
                "index": "analyzed",
                "analyzer": "ik_max_word"             //设置IK分词器
              },
              "price": {
                "type": "long"
              },
              "LaunchDate": {
                "type": "date",
                "format": "yyyy年MM月dd日"             //日期格式应根据实际数据设置
              },
              "screenSize": {
                "type": "keyword"
              },
              "resolution": {
                "type": "keyword"
              },
              "processor": {
                "type": "keyword"
              },
              "battery": {
                "type": "long"
              },
              "ram": {
                "type": "long"
              },
              "rom": {
                "type": "long"
              },
              "backCamera": {
                "type": "long"
              },
              "frontCamera": {
              "type": "long"
            }
          }
        }
      }
    }'

在爬取的数据中,可以利用手机的品牌或型号,对手机产品数据进行全文检索。在图3.29中使用全文检索中的match_phrase_prefix查询对手机产品信息进行检索,该图左侧是相应的代码实现,右侧是检索结果。

图3.29 执行match_phrase_prefix查询

采用词项检索中的range查询,对上市时间在特定日期范围内的手机进行检索,其检索的代码和结果展示如图3.30所示。

基于Lucene的more_like_this查询,是为了检索与所提供的内容相似的文档结果集。这种查询方法也可以用来实现初步的信息推荐。例如,利用more_like_this方法,在天极手机产品数据集中的phoneName字段检索与“魅族PRO6Plus(64GB/双4G)”相似的数据集,其代码段展示以及结果如图3.31所示。

聚合是统计数据十分有力的工具,能够对数据集有一个宏观上的了解。下面使用metric aggregations中的extended_stats聚合对所有手机产品的售价进行统计,其代码和聚合结果如图3.32所示。

图3.30 对range查询的实现

图3.31 对more_like_this查询的实现

可使用bucket aggragations中的histogram聚合来为柱状图的生成提供元数据。下面针对不同价位的手机进行1000元一档的价位统计,相关代码段和结果展示如图3.33所示。

图3.32 对extended_stats聚合的实现

图3.33 对histogram聚合的实现

下面使用matrix aggregations中的matrix_stats聚合,对手机产品数据中,机身存储容量(rom字段)和手机售价(price字段)之间的关系进行计算。相关代码可参照代码段3.49,结果展示如图3.34所示。

图3.34 对matrix_stats聚合的实现