http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 10087|回复: 4

[Elasticsearch] 54-Elasticsearch非规范化和并发

[复制链接]
发表于 2019-1-10 14:36:10 | 显示全部楼层 |阅读模式
非规范化和并发

      当然,数据非规范化也有弊端。 第一个缺点是索引会更大因为每个博客文章文档的 _source 将会更大,并且这里有很多的索引字段。这通常不是一个大问题。数据写到磁盘将会被高度压缩,而且磁盘已经很廉价了。Elasticsearch 可以愉快地应付这些额外的数据。

更重要的问题是,如果用户改变了他的名字,他所有的博客文章也需要更新了。幸运的是,用户不经常更改名称。即使他们做了, 用户也不可能写超过几千篇博客文章,所以更新博客文章通过 scroll 和 bulk APIs 大概耗费不到一秒。

然而,让我们考虑一个更复杂的场景,其中的变化很常见,影响深远,而且非常重要,并发。

在这个例子中,我们将在 Elasticsearch 模拟一个文件系统的目录树,非常类似 Linux 文件系统:根目录是 / ,每个目录可以包含文件和子目录。

我们希望能够搜索到一个特定目录下的文件,等效于:

[C#] 纯文本查看 复制代码
grep "some text" /clinton/projects/elasticsearch/*

这就要求我们索引文件所在目录的路径:

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

{

  "name":     "README.txt", 

  "path":     "/clinton/projects/elasticsearch", 

  "contents": "Starting a new Elasticsearch project is easy..."

}



  • 文件名
  • 文件所在目录的全路径



事实上,我们也应当索引 directory 文档,如此我们可以在目录内列出所有的文件和子目录,但为了简洁,我们将忽略这个需求。

我们也希望能够搜索到一个特定目录下的目录树包含的的任何文件,相当于此:

[C#] 纯文本查看 复制代码
grep -r "some text" /clinton

为了支持这一点,我们需要对路径层次结构进行索引:

  • /clinton
  • /clinton/projects
  • /clinton/projects/elasticsearch

这种层次结构能够通过 path 字段使用 path_hierarchy tokenizer 自动生成:
[C#] 纯文本查看 复制代码
PUT /fs

{

  "settings": {

    "analysis": {

      "analyzer": {

        "paths": { 

          "tokenizer": "path_hierarchy"

        }

      }

    }

  }

}



  • 自定义的 paths 分析器在默认设置中使用 path_hierarchy tokenizer。


file 类型的映射看起来如下所示:
[C#] 纯文本查看 复制代码
PUT /fs/_mapping/file

{

  "properties": {

    "name": { 

      "type":  "string",

      "index": "not_analyzed"

    },

    "path": { 

      "type":  "string",

      "index": "not_analyzed",

      "fields": {

        "tree": { 

          "type":     "string",

          "analyzer": "paths"

        }

      }

    }

  }

}



  • name 字段将包含确切名称。
  • path 字段将包含确切的目录名称,而 path.tree 字段将包含路径层次结构。


一旦索引建立并且文件已被编入索引,我们可以执行一个搜索,在 /clinton/projects/elasticsearch 目录中包含 elasticsearch 的文件,如下所示:
[C#] 纯文本查看 复制代码
GET /fs/file/_search

{

  "query": {

    "filtered": {

      "query": {

        "match": {

          "contents": "elasticsearch"

        }

      },

      "filter": {

        "term": { 

          "path": "/clinton/projects/elasticsearch"

        }

      }

    }

  }

}




仅在该目录中查找文件。

所有在 /clinton 下面的任何子目录存放的文件将在 path.tree 字段中包含 /clinton 词项。所以我们能够搜索 /clinton 的任何子目录中的所有文件,如下所示:
[C#] 纯文本查看 复制代码
GET /fs/file/_search

{

  "query": {

    "filtered": {

      "query": {

        "match": {

          "contents": "elasticsearch"

        }

      },

      "filter": {

        "term": { 

          "path.tree": "/clinton"

        }

      }

    }

  }

}



在这个目录或其下任何子目录中查找文件。

重命名文件和目录编辑
到目前为止一切顺利。 重命名一个文件很容易--所需要的只是一个简单的 update 或 index 请求。 你甚至可以使用 optimistic concurrency control 确保你的变化不会与其他用户的变化发生冲突:
[C#] 纯文本查看 复制代码
PUT /fs/file/1?version=2 

{

  "name":     "README.asciidoc",

  "path":     "/clinton/projects/elasticsearch",

  "contents": "Starting a new Elasticsearch project is easy..."

}



version 编号确保该更改仅应用于该索引中具有此相同的版本号的文档。

我们甚至可以重命名一个目录,但这意味着更新所有存在于该目录下路径层次结构中的所有文件。 这可能快速或缓慢,取决于有多少文件需要更新。我们所需要做的就是使用 scroll 来检索所有的文件, 以及 bulk API 来更新它们。这个过程不是原子的,但是所有的文件将会迅速转移到他们的新存放位置。



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2019-1-10 14:55:25 | 显示全部楼层
强烈支持楼主ing……
发表于 2019-1-10 15:34:08 | 显示全部楼层
真是难得给力的帖子啊。
发表于 2019-1-10 16:42:38 | 显示全部楼层
强烈支持楼主ing……
发表于 2019-1-10 16:45:15 | 显示全部楼层
强烈支持楼主ing……
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-12-23 00:07

© 2014-2021

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