美文网首页
0x00.搜索引擎基础和ES

0x00.搜索引擎基础和ES

作者: 0x70e8 | 来源:发表于2018-06-13 19:20 被阅读0次

    文档

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

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

    在大多数应用中,多数实体或对象可以被序列化为包含键值对的 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

    参考资料

    相关文章

      网友评论

          本文标题:0x00.搜索引擎基础和ES

          本文链接:https://www.haomeiwen.com/subject/hwqseftx.html