0x00.搜索引擎基础和ES

文档

文档是搜索引擎的数据源,所有的检索等操作都是面向文档的,是搜索引擎的基础。

文档包含一个或多个字段,每个字段被赋予具体的字段类型:字符串、标记化文本、布尔值、日期、时间、经纬度等等。文档就是包含一系列字段的集合。是数据的抽象表示。但是在搜索引擎中,文档是扁平且互相独立的数据。

在大多数应用中,多数实体或对象可以被序列化为包含键值对的 JSON 对象。 一个 键 可以是一个字段或字段的名称,一个 值 可以是一个字符串,一个数字,一个布尔值, 另一个对象,一些数组值,或一些其它特殊类型诸如表示日期的字符串,或代表一个地理位置的对象。
通常情况下,我们使用的术语对象和文档是可以互相替换的。不过,有一个区别: 一个对象仅仅是类似于 hash 、 hashmap 、字典或者关联数组的 JSON 对象,对象中也可以嵌套其他的对象。 对象可能包含了另外一些对象。在 Elasticsearch 中,术语文档有着特定的含义。它是指最顶层或者根对象, 这个根对象被序列化成 JSON 并存储到 Elasticsearch 中,指定了唯一 ID。

潜在的字段类型的数量是无限的,因为一个字段类型是由若干分析步骤组成的,这些步骤会决定数据如何在字段中被处理,以及如何映射到搜索引擎中。每个字段在搜索引擎的schema(ES中是mapping)被定义为特定的字段类型,文档通过定义schema,映射为特定字段类型的字段集合,文档的每个字段根据其字段类型进行内容分析,分析的结果保存在索引中,这样在发起查询时能检索到相关信息。

文档元数据

一个文档不仅仅包含它的数据 ,也包含 元数据 —— 有关 文档的信息。 三个必须的元数据元素如下:

  • _index 文档在哪存放
  • _type 文档表示的对象类别
  • _id 文档唯一标识

索引

通过使用 index API ,文档可以被 索引 —— 存储和使文档可被搜索 。 但是首先,我们要确定文档的位置。一个文档的元数据 _index 、 _type 和_id 唯一标识一个文档。 我们可以提供自定义的 _id 值,或者让 index API 自动生成。
存储数据到 Elasticsearch 的行为叫做 索引 ,但在索引一个文档之前,需要确定将文档存储在哪里。

  • 索引(名词):

一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。 索引 (index) 的复数词为 indices 或 indexes 。

  • 索引(动词):

索引一个文档 就是存储一个文档到一个 索引 (名词)中以便它可以被检索和查询到。这非常类似于 SQL 语句中的 INSERT 关键词,除了文档已存在时新文档会替换就文档情况之外。

  • 倒排索引:

关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引(反向索引) 的结构来达到相同的目的。
非结构化数据中所存储的信息是每个文件包含哪些字符串,也即已知文件,欲求字符串相对容易,也即是从文件到字符串的映射。而我们想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,也即从字符串到文件的映射。两者恰恰相反。于是如果索引总能够保存从字符串到文件的映射,则会大大提高搜索速度。
由于从字符串到文件的映射是文件到字符串映射的反向过程,于是保存这种信息的索引称为反向索引。

默认的,一个文档中的每一个属性都是 被索引 的(有一个倒排索引)和可搜索的。一个没有倒排索引的属性是不能被搜索到的。

索引创建过程

  1. 有一系列被索引的文件。
  2. 被索引文件经过语法分析和语言处理形成一系列的词(term)。
  3. 经过索引创建形成词典和反向索引表。
  4. 通过索引存储将索引写入磁盘。
分析与分析器

分析 包含下面的过程:

  1. 首先,将一块文本分成适合于倒排索引的独立的 词条 ,
  2. 之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall

分析器执行上面的工作。 分析器 实际上是将三个功能封装到了一个包里:

  • 字符过滤器:
    首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and
  • 分词器:
    其次,字符串被 分词器 分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。
  • Token 过滤器:
    最后,词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如,小写化 Quick ),删除词条(例如, 像 aandthe 等无用词),或者增加词条(例如,像 jump 和 leap 这种同义词)。

Elasticsearch提供了开箱即用的字符过滤器、分词器和token 过滤器。

索引分片和路由

在ES中,索引只是一个逻辑上的存储单元,实际的存储单元是shard,即分片。一个索引包含多个分片(分片数量在创建索引是确定,且后期不可改变),分片拥有多个副本,副本和主分片的数据是同步的,在分布式的部署中,分片会分散在多个节点中,一方面保护数据,另一方面可以并行检索分片。

路由即文档到分片的映射逻辑,通过路由找到文档存储的分片。默认使用文档的id进行路由,可以自定义为其他字段。

结构化数据和非结构化数据

  • 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
  • 非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。 非结构化数据又一种叫法叫全文数据。
  • 有的地方还会提到第三种,半结构化数据,如XML,HTML等,当根据需要可按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。

按照数据的分类,搜索也分为两种:

  1. 对结构化数据的搜索:如对数据库的搜索,用SQL语句。再如对元数据的搜索,如利用windows搜索对文件名,类型,修改时间进行搜索等。
  2. 对非结构化数据的搜索:如利用windows的搜索也可以搜索文件内容,Linux下的grep命令,再如用Google和百度可以搜索大量内容数据。

对非结构化数据也即对全文数据的搜索主要有两种方法:

  1. 顺序扫描法(Serial Scanning)
  2. 全文检索(Full-text Search)

全文检索

全文检索大体分两个过程,索引创建(Indexing)和搜索索引(Search):

  1. 索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。
  2. 搜索索引:就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程。

映射

为了能够将时间域视为时间,数字域视为数字,字符串域视为全文或精确值字符串, Elasticsearch 需要知道每个域中数据的类型。这个信息包含在映射中。

数据类型

  • Core datatypes
类别 数据类型
string text (可全文检索,不可精确匹配),keyword(精确匹配)
Numeric datatypes long, integer, short, byte, double, float, half_float, scaled_float
Date datatype date
Boolean datatype boolean
Binary datatype binary
Range datatypes integer_range, float_range, long_range, double_range, date_range
  • Complex datatypes
类别 数据类型
Array datatype Array support does not require a dedicated type
Object datatype object for single JSON objects
Nested datatype nested for arrays of JSON objects
  • Geo datatypes
类别 数据类型
Geo-point datatype geo_point for lat/lon points
Geo-Shape datatype geo_shape for complex shapes like polygons
  • Specialised datatypes
类别 数据类型
IP datatype ip for IPv4 and IPv6 addresses
Completion datatype completion to provide auto-complete suggestions
Token count datatype token_count to count the number of tokens in a string
mapper-murmur3 murmur3 to compute hashes of values at index-time and store them in the index
Percolator type Accepts queries from the query-dsl
join datatype Defines parent/child relation for documents within the same index

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容