苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 8930|回复: 3

[Elasticsearch] 51-Elasticsearch应用层联接

[复制链接]
发表于 2019-1-10 14:34:46 | 显示全部楼层 |阅读模式
应用层联接

   我们通过在我们的应用程序中实现联接可以(部分)模拟关系 数据库。 例如,比方说我们正在对用户和他们的博客文章进行索引。在关系世界中,我们会这样来操作:

[C#] 纯文本查看 复制代码
PUT /my_index/user/1 

{

  "name":     "John Smith",

  "email":    "john@smith.com",

  "dob":      "1970/10/24"

}



PUT /my_index/blogpost/2 

{

  "title":    "Relationships",

  "body":     "It's complicated...",

  "user":     1 

}



  • 每个文档的 index, type, 和 id 一起构造成主键。
  • blogpost 通过用户的 id 链接到用户。index 和 type 并不需要因为在我们的应用程序中已经硬编码。


通过用户的 ID 1 可以很容易的找到博客帖子。
[C#] 纯文本查看 复制代码
GET /my_index/blogpost/_search

{

  "query": {

    "filtered": {

      "filter": {

        "term": { "user": 1 }

      }

    }

  }

}

为了找到用户叫做 John 的博客帖子,我们需要运行两次查询: 第一次会查找所有叫做 John 的用户从而获取他们的 ID 集合,接着第二次会将这些 ID 集合放到类似于前面一个例子的查询:
[C#] 纯文本查看 复制代码
GET /my_index/user/_search

{

  "query": {

    "match": {

      "name": "John"

    }

  }

}



GET /my_index/blogpost/_search

{

  "query": {

    "filtered": {

      "filter": {

        "terms": { "user": [1] }  

      }

    }

  }

}




  • 执行第一个查询得到的结果将填充到 terms 过滤器中。


应用层联接的主要优点是可以对数据进行标准化处理。只能在 user 文档中修改用户的名称。缺点是,为了在搜索时联接文档,必须运行额外的查询。

在这个例子中,只有一个用户匹配我们的第一个查询,但在现实世界中,我们可以很轻易的遇到数以百万计的叫做 John 的用户。 包含所有这些用户的 IDs 会产生一个非常大的查询,这是一个数百万词项的查找。

这种方法适用于第一个实体(例如,在这个例子中 user )只有少量的文档记录的情况,并且最好它们很少改变。这将允许应用程序对结果进行缓存,并避免经常运行第一次查询。



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2019-1-10 14:54:57 | 显示全部楼层
强烈支持楼主ing……
发表于 2019-1-10 15:34:37 | 显示全部楼层
强烈支持楼主ing……
发表于 2019-1-10 16:44:33 | 显示全部楼层
感恩无私的分享与奉献
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-27 16:27

© 2014-2021

快速回复 返回顶部 返回列表