前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ElasticSearch 高亮显示大文档搜索结果的策略和性能对比

ElasticSearch 高亮显示大文档搜索结果的策略和性能对比

作者头像
九州暮云
发布于 2019-08-21 03:14:20
发布于 2019-08-21 03:14:20
2.4K00
代码可运行
举报
文章被收录于专栏:九州牧云九州牧云
运行总次数:0
代码可运行

2016年12月,我们开始研究Ambar——一个文档搜索系统。Ambar使用ElasticSearch作为核心搜索引擎。

在Ambar开发的过程中,我们处理了很多与ES相关的问题,我们想分享我们得到的宝贵经验。让我们从每个搜索系统的一个重要功能开始——高亮显示搜索结果。

在任何搜索系统的可用性中,适当的结果高亮显示是最有价值的部分,首先,它为用户提供了关于内部搜索逻辑的必要信息,以及为什么显示该结果。此外,它也使我们能够仅仅通过快速浏览重点而不是下载和浏览整个文档来估计结果。

因为Ambar是一个文档搜索系统,我说的文档也是指文件,所以它必须处理非常大的文件(就全文搜索而言),大小大于100Mb。本文介绍了在利用ElasticSearch高亮显示大型文档时如何达到高性能。

定义问题

Ambar使用ES作为搜索引擎,搜索经过解析的文件/文档内容及其元数据。下面是Ambar在ES中存储一个文档的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    sha256: "1a4ad2c5469090928a318a4d9e4f3b21cf1451c7fdc602480e48678282ced02c",
    meta: [
        {
            id: "21264f64460498d2d3a7ab4e1d8550e4b58c0469744005cd226d431d7a5828d0",
            short_name: "quarter.pdf",
            full_name: "//winserver/store/reports/quarter.pdf",
            source_id: "crReports",
            extension: ".pdf",
            created_datetime: "2017-01-14 14:49:36.788",
            updated_datetime: "2017-01-14 14:49:37.140",
            extra: [],
            indexed_datetime: "2017-01-16 18:32:03.712"
        }
    ],
    content: {
        size: 112387192,
        indexed_datetime: "2017-01-16 18:32:33.321",
        author: "John Smith",
        processed_datetime: "2017-01-16 18:32:33.321",
        length: "",
        language: "",
        state: "processed",
        title: "Quarter Report (Q4Y2016)",
        type: "application/pdf",
        text: ".... laaaaaarge text here ...."
    }
}

上面的JSON文档是一个解析后的.pdf文件,里面有财务报告,文件大小约为100Mb。content.text字段包含报告的解析文本,其大小也约为100Mb。

让我们做一个简单的实验。索引1000个文档,如我以前指定的文档,而不定义任何索引调优或自定义映射。然后看看ES会多快地搜索它们,并高亮显示content.text字段中的检索关键字。

结果如下:

  • 在content.text字段中进行match_phrase搜索会耗费5-30秒
  • 突出显示content.text字段中的文本内容,每次命中平均需要10秒

这种结果是不能接受的。任何使用搜索系统的用户都希望在点击“搜索”按钮后立即得到搜索结果,而不需要等待半分钟就会出现第一个结果。让我们来看看高亮显示这个缓慢突出的问题并解决它。

选择高亮策略

ES 和 Lucene底层有三种高亮策略可供选择,这是官方文档链接,三种策略如下:

  • Plain - ES中默认的高亮显示,它是最慢的,但它做了最精确的高亮显示,几乎完全匹配Lucene的搜索逻辑。要高亮显示检索关键字,它必须将整个文档加载到内存中并重新分析它。
  • Postings - 更快的一个。它将文档的字段分割成句子,并使用BM25算法对匹配的结果进行标记,从而对结果进行排序,但它需要在索引中额外存储句子的位置。
  • Fast Vector Highlighting (FVH) - 似乎是最快的,特别是对于大型文档。需要为索引中的每个令牌存储位置偏移量。在本例中,要对检索词进行高亮显示,它不需要检索整个文档,只需检索接近命中的令牌,由于每个令牌的位置是已知的,因此这个速度非常快。

因此,现在你可以猜到为什么ES可以开箱即用地对大文档中的检索关键字高亮显示。对于每次命中检索整个文档并重新分析它的性能非常昂贵,尤其是对于大于1Mb的文档。

由于我们绝对不能使用普通的高亮显示方式,我们测试了Postings和FVH。最后的选择是FVH,原因如下:

  • 如果使用FVH,一个100Mb的文档高亮显示大约需要10-20毫秒,Postings大约需要一秒钟
  • Postings并不总是正确地将文档的字段划分为句子,这就是为什么高亮显示的大小会有很大的差异(在某些情况下,从50个单词到数千个单词)。FVH没有这种问题,因为它检索固定数量的令牌,而不是句子。
  • Postings以任何顺序突出显示令牌,在复杂查询中不能正常工作。对于引用,它不会正确地突出显示具有指定slop值的match_phrase查询的结果。它将把它解释为bool查询,高亮显示整个文档字段中的每个匹配令牌。

在FVH测试中,我们发现了一个非常棘手的问题。它确实解释了match_phrase查询,而不是Lucene的搜索。它只按查询中指定的顺序突出显示令牌,但Lucene的搜索将令牌按任意顺序解释为命中。如果您正在搜索“John Smith”短语,但是文档在其字段中有“Smith John”值,ES将检索该文档作为命中结果,但FVH不会高亮显示它。解决这个问题的办法是短语置换。我们提交不同的查询以搜索和高亮显示,Search获取默认查询,高亮显示通过修改源短语中所有单词位置的变化而构建查询。

总结

ES实际上可以处理大型文档,并且仍然能够提供相当好的性能,重要的是正确地设置索引并记住所有与ES相关的问题。

编译自:Highlighting Large Documents in ElasticSearch

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ElasticSearch 6.x 学习笔记:19.搜索高亮
参照官方文档 https://www.elastic.co/guide/en/elasticsearch/reference/6.1/search-request-highlighting.html
程裕强
2022/05/06
5350
Elasticsearch安装使用教程
Elasticsearch是一个全文搜索引擎。安装Elasticsearch时需要先安装Java。 wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.4.2.zip unzip elasticsearch-1.4.2.zip cd elasticsearch-1.4.2 ./bin/elasticsearch
星哥玩云
2022/07/04
4200
Elasticsearch安装使用教程
elasticsearch的一些小知识点
A little nonsense now and then is relished by the wisest people.
小闫同学啊
2020/02/19
3670
Elasticsearch大文件检索性能提升20倍实践(干货)
少废话,直接开始。 1、大文件是多大? ES建立索引完成全文检索的前提是将待检索的信息导入Elaticsearch。 项目中,有时候需要将一些扫描件、PDF文档、Word、Excel、PPT等文档内容导入Elasticsearch。 比如:将《深入理解Elasticsearch》这边书导入ES,而这边书的全文内容被识别后的大小可能为3MB——5MB以上的字节。 存入ES后是一个content字段,对这个content执行全文检索&高亮显示,就存在检索效率低的问题,会耗时30S以上的时间。 这点,作为习惯了搜
铭毅天下
2018/03/20
2.2K0
Elasticsearch大文件检索性能提升20倍实践(干货)
十九种Elasticsearch字符串搜索方式终极介绍
刚开始接触Elasticsearch的时候被Elasticsearch的搜索功能搞得晕头转向,每次想在Kibana里面查询某个字段的时候,查出来的结果经常不是自己想要的,然而又不知道问题出在了哪里。出现这个问题归根结底是因为对于Elasticsearch的底层索引原理以及各个查询搜索方式的不了解,在Elasticsearch中仅仅字符串相关的查询就有19个之多,如果不弄清楚查询语句的工作方式,应用可能就不会按照我们预想的方式运作。这篇文章就详细介绍了Elasticsearch的19种搜索方式及其原理,老板再也不用担心我用错搜索语句啦!
用户7353950
2022/05/10
1.4K0
总是搜不到想要的内容?Elasticsearch搜索排名优化了解一下
虽然使用 ES 可以非常方便快速地搭建出搜索平台,但搜出来的结果往往不符合预期。因为 ES 是一个通用的全文搜索引擎,它无法理解被搜索的内容,通用的配置也无法适合所有内容的搜索。所以 ES 在搜索中的应用需要针对具体的平台做很多的优化才可以达到良好的效果。
腾讯云开发者
2020/07/23
1.9K0
干货 | Elasticsearch通用优化建议
Elasticsearch开发实战的后期会遇到性能问题,包括:创建索引性能、写入数据性能、检索性能等。网上有很多结合自己实际应用场景的相关优化建议,但“对症下药”才是关键。
铭毅天下
2018/10/09
1.3K0
elasticsearch深入搜索一之近似匹配
1. 从上面几种分词器的对比中可以看出,拼音分词器主要是把中文转换成拼音的方式进行分词; 2. ik_max_word分词和ik_smart分词器主要是索引单词而不是索引独立的单词; 3. standard分词器主要是索引独立的单词而不对词项进行索引。
山行AI
2019/06/28
2.8K0
ElasticSearch教程(二)—— 基本使用
ElasticSearch是面向文档的,它存储文档,并索引每个文档的内容使之可以被索引。ES选择json作为文档序列化格式。
逝兮诚
2019/10/30
6910
Elasticsearch搜索特性
方案一、可以是用wildcard通配符,但是要设置不分词,这种方案性能不好 方案二、可以使用ngram分词器 “min_gram”: 2,”max_gram”: 3 单词假设是 abcde0001 ab bc cd abc cde 001.。。。等等 被分词2个字母一组和3个字符一组。。、。
丁D
2022/08/12
8170
Elasticsearch学习搜索的笔记
1.普通查询(全文搜索) 查询name=Smith的文档数据 GET /megacorp/employee/_search { "query" : { "match" : { "name" : "smith" } } } 备注: 返回结果当中存在max_score和每个记录当中的_score表示最大相关性分数和该记录的相关性分数 2.组合查询 查询name=smith并且年龄大于30岁 GET /megacorp/employee/_
苦咖啡
2018/04/28
5940
Elasticsearch Query DSL之全文检索(Full text queries)下篇
本文将继续介绍Elasticsearch Query DSL之全文检索(Full text queries)方式的后3种。
丁威
2019/06/10
2.2K0
一起学Elasticsearch系列-模糊搜索
在 Elasticsearch 中,模糊搜索是一种近似匹配的搜索方式。它允许找到与搜索词项相似但不完全相等的文档。
BookSea
2023/12/13
9060
一起学Elasticsearch系列-模糊搜索
从提高 Elasticsearch 搜索体验说开去......
注意:我输入的是“触发器”,返回结果第一条没有问题,其他几条有关:“触”、“发”的,可以说和我的搜索没有关系。
铭毅天下
2020/10/09
7700
从提高 Elasticsearch 搜索体验说开去......
ElasticSearch核心知识讲解
倒排索引倒排索引建立流程倒排索引具体组成分词Analysis(文本分析)Analyzer(分词器)分词测试mapping字段数据类型核心类型字符串类型数字类型日期类型二进制类型范围类型复杂类型对象类型嵌套类型地理类型经纬度类型地理区域类型特殊类型字段的公共属性:字符串类型常用的其他属性dynamic动态映射静态映射精确映射查询matchtermmatch_phrase
857技术社区
2022/05/17
1.4K0
ElasticSearch核心知识讲解
白话Elasticsearch62-进阶篇之Highlighting高亮显示
会变成红色,所以说你的指定的field中,如果包含了那个搜索词的话,就会在那个field的文本中,对搜索词进行红色的高亮显示。
小小工匠
2021/08/17
1.3K0
ElasticSearch实战系列02:中文+拼音混合检索,并高亮显示
本文仿照QQ的用户搜索,搭建一个中文+拼音的混合检索系统,并高亮显示检索字段。全文共分为以下几部分:
方才编程_公众号同名
2020/11/13
4.9K2
ElasticSearch实战系列02:中文+拼音混合检索,并高亮显示
Elasticsearch Query DSL之全文检索(Full text queries)上篇
全文索引查询,这意外着首先会对待查字符串(查询条件)进行分词,然后再去匹配,返回结果中会待上本次匹配的关联度分数。
丁威
2019/06/10
2.1K0
学好Elasticsearch系列-Query DSL
DSL是Domain Specific Language的缩写,指的是为特定问题领域设计的计算机语言。这种语言专注于某特定领域的问题解决,因而比通用编程语言更有效率。
BookSea
2023/08/03
4090
学好Elasticsearch系列-Query DSL
白话Elasticsearch17-深度探秘搜索技术之match_phrase query 短语匹配搜索
https://www.elastic.co/guide/en/elasticsearch/reference/current/full-text-queries.html
小小工匠
2021/08/17
9570
相关推荐
ElasticSearch 6.x 学习笔记:19.搜索高亮
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验