ZibuのHippocampus

人生天地间,忽如远行客

Inverted Index,反向索引,又名倒排索引,用于实现全文搜索。在本文中,我们会深入介绍ES的反向索引机制。

索引数据流程: 在数据进入ES 中时,我们会对数据进行分词,将其划分出多个Terms,然后建立 Terms 到 Document ID 的映射,然后将 Terms加入了字典树Term index中。

查询数据: 先从字典树 Term index 中找到对应 terms,从而获取对应的 document id,最后获取真实的数据。

Term Index -> Term Dictionary -> IDs (Posting List)->Docs

阅读全文 »

Ingest pipeline 用于拦截数据索引请求,对数据执行预定义处理逻辑然后再继续索引数据。

只要节点具有 Ingest role就能够执行 Ingest Pipeline,每个索引都可以设置默认Ingest Pipeline,该参数可以在索引时覆盖。

阅读全文 »

Term查询需要对关键词进行全匹配,如果存在空格和大小写的问题也会影响匹配。

因此对于 Keyword类型的字段必须完全一致,对于text类型的字段则必须跟分词后的 token完成一致。文档才算匹配。

  • Term: 返回精确匹配term(必须完全一致)的文档,不能正常使用于Text字段(解释见下文)。

  • Terms: 同Term查询,且允许对多个 terms进行查询,只要匹配其中任意一个 term,文档就算被匹配。

    • Terms lookup: 将某个文档的字段的值作为Term list.
  • Terms set: 同Terms,但是可以限制最少匹配的terms数量。

  • Wildcard: 可以在想要查询的terms中添加通配符。

  • Regexp: Wildcard的扩充版,支持在查询的Terms中使用正则表达式。如果查询不如预期,请考虑Lucence解析正则时,有限状态机设置。

  • Prefix: 匹配字段值中包含某个特定前缀的文档

  • Range: 针对Date, 数字,Range类型的范围查询

  • Fuzzy: 返回term与查询term相似的文档, 会对输入的文档进行根据编辑距离的模糊匹配。

  • Exists: 返回某个字段值不为空的所有文档。

  • IDs: 批量返回与输入ID相匹配的文档。

阅读全文 »

Elasticsearch 的高亮(highlight)可以从搜索结果中多个字段中获取突出显示的摘要,以便向用户显示查询匹配的位置。

响应结果的 highlight 字段中包括高亮的字段和高亮的片段。Elasticsearch 默认会用 <em></em> 标签标记关键字。

高亮操作需要获取文档filed的实际内容,因此当一个filed没有存储时(Mapping 中没有设置 storetrue), 真实的_source将会被加载,来获取相关 field的内容。

阅读全文 »

对查询过滤后的结果集进行排序,可以对基于 **字段,数组,Nested(JsonArr)**类型进行排序。

当存在多条排序语句时,后续排序只对排序结果相同的文档进行重新排序,而非对全部结果姐

  • 字段类型: 直接排序
  • 数值数组: 选择排序模式,计算排序值,基于排序值排序
  • nested: 原理同数值数组类型,可以添加filter查询,来针对匹配过滤查询的Json文档才执行排序计算
  • geo distance sorting: todo
阅读全文 »

当你需要做全文查询时,如果你对查询的terms顺序没有要求,则使用 match query,如果对顺序有要求,则使用 match_phrase query 。如果你对你需要更细粒度的查询则可以考虑 query_string, intervals

  • intervals: 可以对匹配项的顺序和之间的距离进行的细粒度的匹配。
  • match: 对输入进行分词,默认情况只要文档字段匹配任意一个Term即可。(可设置为Terms全匹配,即词组匹配,match_phrase)。 支持模糊,同义词,最小匹配terms等查询。
  • match_bool_prefix: Analyzer对输入的参数进行分词,最后一个分词会变为prefix查询,其他分词将会变为term查询。所有这些查询会以Boolean.should进行连接。
  • match_phrase: 对分词后的Terms进行顺序和内容的全匹配,即只有目标字段同时包含所有分词,分词顺序按序且分词间隔在规定范围内(默认为0,分词需要紧挨,参数slop调整)才行。
  • match_phrase_prefix: 基本等同于match_phrase, 只是最后一个Terms只需要前缀匹配即可。
  • multi_match: 对多个字段使用match query,字段名称可以使用通配符。 至于使用哪种 Match Query,取决于Type(best_fields,most_fields等)设置。
  • common: 暂时没有深入了解,相对专业化,与stopwords相关。
  • query_string: 支持简洁的Lucene查询字符串语法,允许您在单个查询字符串中指定AND | OR | NOT条件和多字段搜索。 仅限于专业用户。
  • simple_query_string: 一个相对简化的query_string查询。
阅读全文 »

  • bool query: 具有以下四种模式,任意搭配,must和should子句叠加计算出最终文档评分
    • must: 必须匹配
    • should: 当不存在must和filter时,必须匹配should查询子句中的一条。否则可以不匹配。 可以配置Should子句最小匹配条数。
    • filter: 必须匹配,且不纳入计算相关性评分
    • must_not: 必须不匹配,且不纳入计算相关性评分
  • boosting query: 该查询可以用于当你不希望排除某些文档,却想降低他们的评分时。设置positive和negative查询,返回所有匹配positive查询的文档。 当文档同时匹配negative查询时,将评分乘以negative_boost.
  • constant_score query: 给予文档固定评分。查询文档,并设置所有匹配文档的评分为设定好的boost值。
  • dis_max query: 类似 Boolean_should, 匹配查询越多,得分越高。使用多个查询语句查询,当匹配多条查询时,计算相关性评分为=最高分+SUM(其他评分*tie_breaker)
  • function_score query: 自定义评分计算方式。 设置多个filter函数,将其评分加权计算,最后根据设置好的方式汇总。
阅读全文 »

聚合函数用于在查询和过滤后的数据集上,进行按类聚合以获取总体统计数据。聚合函数根据其作用方式和原理,被分为以下四个类型

  • Bucketing: 将文档根据设置好的判定条件,划分到不同的 Bucket 中去。(类似 SQL 的 GroupBy
  • Metric: 计算一组文档的数据,如 max,min,avg 等。当直接使用时会对所有文档计算,通常作为在 Bucketing 函数的子函数出现,计算每个 Bucket 的相关 Metric 数据。
  • Matrix: 顾名思义,该类聚合函数在多个字段上生效,用于生成矩阵。不支持 Scripting(自定义脚本)。
  • Pipeline: 用于聚合其他聚合函数的结果。

Notes: 聚合函数嵌套,可以将聚合函数不断嵌套,每个子函数都会在父聚合的结果和输出上继续执行。通常就是 Bucketing 聚合+Metrics 子聚合用于对于不同 Buckets 进行数据总结,再使用 Pipeline 聚合对 Buckets 进行筛选过滤排序展示。

阅读全文 »
0%