最新 elasticsearch 搜索技术
文章平均质量分 56
专门研究搜索相关技术,分享elasticsearch 6.x和Lucene 7.x相关知识点
布道
专注但要有大局观(先大后小,思路为先,实验为辅)
展开
-
Elasticsearch reindex效率提升
如果你的mapping里某个类型有修改或者你需要迁移数据那就可以借助reindex来完成,它很方便的进线异步重建,并且还支持跨集群。如果您使用零副本进行索引,则恢复副本的过程本质上是逐字节的网络传输。reindex的底层是是通过scroll实现,每个Scroll请求,可以分成多个Slice请求,可以理解为切片,各Slice独立并行,利用Scroll重建或者遍历要快很多倍。如果每批索引1000个文档(1000个文档是1mb),调整size值从大约5-15 MB的大容量开始,直到你看不到性能的提升。原创 2023-01-03 19:34:51 · 1474 阅读 · 2 评论 -
Elasticsearch的search之_shards skipped之谜
es从 v5.6 开始引入了 pre-filter 机制(skipped):对于 Date 类型的 Range 查询,在对分片执行搜索之前,先检查一下分片是否包括被查询的数据范围,如果查询的范围与分片持有的数据没有交集,就跳过该分片。"_shards":{ "total": 130, "successful": 130, "skipped": 2, "failed": 0}skipped(Integer) Number of shards that skipp...原创 2020-07-11 13:28:15 · 1737 阅读 · 1 评论 -
Elasticsearch的copy_to探秘
es从6.7开始提供了copy来提高搜索的效率。它源于_all的,假如我们要经常对这三个字段进行搜索,那么一种方法我们可以在must子句中使用should子句运行bool查询。这种方法写起来比较麻烦。有没有一种更好的方法呢?copy_to可以将它们合成一个字段,这样可以方便我们的搜索。{ "city" : "北京", "province" : "北京", "country" : "中国", "location" : { ...原创 2020-07-11 12:52:05 · 4027 阅读 · 4 评论 -
ElasticSearch update api 和 update_by_query哪家强
很久没有怎么随记笔记了,今天这里是为了纠正一个一直以来我们使用es的一个误区,这个误区很大的可能你会就范。很多童靴会把update_by_query拿mysql的语法特性来用,那你就大错特错了,这里有必要温习下我之前的一篇update_by_query,理论上讲es的准实时的仅限于search,而get id则是实时的。实践往往是检验真理的唯一标准,看下面演示吧<!--1.关闭re...原创 2020-02-21 12:33:00 · 6840 阅读 · 0 评论 -
再谈elasticsearch下的深度分页
Elasticsearch 在业务系统中使用也越来越广,一些开发规范也需要慢慢重视起来。 我们知道在关系型数据库中,我们被告知要注意甚至被明确禁止使用深度分页,在es中也应该尽量避免使用深度分页。es提供的分页查询是通过from和size参数来完成,from默认是0,size默认为10,比如:{ "from" : 100000, "size" : 50, "query" : { "ter...原创 2019-12-06 18:22:55 · 6325 阅读 · 0 评论 -
再谈elasticsearch 高cpu问题
首先要阐述一个观点,任何技术都是为解决某一个领域的问题而存在的,我们在使用它的时候,尽可能使用它的优势(亮点),去发挥它应具备的业务价值。es在很多公司应用非常广泛,它已经成为玩大数据的必备的技能,在之前的章节我吐槽过es写方面的问题,今天将吐槽下es查询-terms语法的那些坑,这里探讨两点:一个是多terms并发带来高CPU,另一个是terms使用不当会导致bug。业务场景我们基于门店...原创 2019-09-28 20:11:31 · 11549 阅读 · 2 评论 -
es6.x下的filter query
说实话玩es的同学一般都会痛苦,为何api又变了?确实,明明按资深专家的建议来,但好像API完全找不到或被移除了,对,只能说es太热了。一般提到查询优化,就避不开filter query。我们query查询的时候会去计算下查询表达式和文档的匹配程度得分,得分越高的排的越靠前,而filter不会,filter是仅仅做过滤。filter主要通过bitset(类似于布隆过滤器,为每个倒排索引搜索...原创 2019-09-03 21:10:02 · 3180 阅读 · 0 评论 -
elasticsearch实践篇:跨表join查询补充篇
在上一篇elasticsearch实践篇:跨表join查询中讲过2种方式,其实并不全面。ES还有2种方法来处理数据实体间的关联关系:Nested objects(嵌套文档)和Parent/child relationships(父子文档)。1. Application-side joins(服务端Join或客户端Join)这种方式,索引之间完全独立(利于对数据进行标准化处理,如便于上述两种...原创 2019-07-31 12:15:09 · 19844 阅读 · 0 评论 -
elasticsearch实践篇:跨表join查询
随着业务发展跨表join查询需求越来越多,系统的慢查询不断报出,引入ElasticSearch 来实现聚合查询势在必行。ES是一个基于 Lucene 的搜索引擎,通过将业务主表及辅表的索引字段及需要like字段同步到ES里,每张表的索引字段最终汇总成一个联合索引,来实现多个表的跨表搜索。性能要求检索需求响应时间均值 20ms 以内,对于命中缓存的在 2ms 以内返回单 Type 与...原创 2019-05-16 12:35:38 · 36030 阅读 · 0 评论 -
elasticsearch实践篇: 智能运输产品
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎。非常幸运的是,之前规划了很久的智能运输产品搜索与推荐在3个月前如期上线了,下面将分享下Elasticsearch 在业务系统中应用。背景一条运输产品是有提货(服务区域)报价、干线(地点到地点)报价、配送(服务区域)报价、路由、项目合同报价、服务区...原创 2019-05-15 22:19:18 · 839 阅读 · 0 评论 -
ElasticSearch update_by_query
项目中需要定时对ElasticSearch的某些数据进行更新,数据量十几万,采用RestClient更新,在没有设置超时的情况下,报错如下:java.io.IOException: listener timeout after waiting for [30000] ms一般通常的做法都是修改超时时间设置:restClient = RestClient.builder( ...原创 2019-03-16 19:37:38 · 6359 阅读 · 2 评论 -
ElasticSearch 源码之Guice
es 使用google开源的依赖注入框架guice,这个项目号称比spring快100倍,不过由于其代码比较简洁,这样的结论是很有可能的。es 是直接把guice的源码放到自己的包内(es把很多开源项目的代码都直接集成到自己项目中,省得依赖一堆的jar包,也使es的jar包达到差不多10M),它位于org.elasticsearch.common.inject目录下。es 里面的组件基本都...原创 2019-03-12 17:13:58 · 966 阅读 · 0 评论 -
Elasticsearch 谜之null values
很多时候,我们需要面临null值的烦扰,查询es时传入null值是要查询出null的数据还是不查这个field呢,稍有不慎就会引发新的bug,这的确是个问题!null_value 意味着无法索引或搜索空值。当字段设置为 null , [] ,和 [null] (这些null的表示形式都是等价的),它被视为该字段没有值。null_value 意味着它将不会被表示为一个反向索引数据结构,它们根...原创 2019-03-12 11:10:18 · 4615 阅读 · 0 评论 -
elasticsearch 数组的注意事项
我都知道lucene是不区分数组类型的,而elasticsearch中没有专用的数组类型,对Array datatype支持不需要专用类型(理解为动态的字符串或object类型)。默认情况下,任何字段都可以包含零个或多个值,但数组中的所有值都必须具有相同的数据类型。本文基于es 6.2,比如:["one","two"] [1,2] [{ "name": "Mary"...原创 2019-03-11 18:39:49 · 8361 阅读 · 0 评论 -
elasticsearch PB级规模数据的深度好文
这里推荐一些大厂的深度好文,对Elasticsearch的实践。阿里云PB级规模数据的Elasticsearch分库分表实践 滴滴Elasticsearch多集群架构实践 有赞Elasticsearch的索引和集群隔离实践 滴滴Elasticsearch Query DSL分析系统 ES在蚂蚁金服的中台实践经验 更多 ...转载 2019-03-07 23:07:00 · 2348 阅读 · 0 评论 -
Elasticsearch 模糊查询 wildcard、regexp、prefix选型
之前讲过Elasticsearch 的wildcard(通配符查询)、regexp(正则查询)、prefix(前缀查询),他们都是致力于模糊搜索,然后在实际的项目中该如何选择,稍不注意就可能到很大性能问题。使用方式这里就不再赘述了,他们都是基于词条查询,它们也需要遍历倒排索引中的词条列表来找到所有的匹配词条,然后逐个词条地收集对应的文档ID。针对Numeric datatypes(long...原创 2019-03-07 13:40:21 · 33887 阅读 · 0 评论 -
elasticsearch 大数据下 bulk 优化
es中 bulk api 可以在单个API调用中执行许多索引/删除操作,这可以大大提高索引速度。在线上突然遇到这样错误:2019-02-27 12:19:07.836 [inner-job-enable-job-61] ERROR com.dangdang.ddframe.job.executor.handler.impl.DefaultJobExceptionHandler :?...原创 2019-02-28 15:56:44 · 40329 阅读 · 0 评论 -
Elasticsearch系列:番外篇-Fielddata
在上一篇DocValues中介绍过,它主要是针对not analyzed String字段存储,那要针对需要分词的字段该如何sort,agg,group,facet呢?一般默认情况下,它会报错。GET /test_index/test_type/_search { "aggs": { "group_by_test_field": { "terms": { ...原创 2019-02-26 22:24:37 · 3528 阅读 · 0 评论 -
Lucene系列:番外篇-DocValues
玩ElasticSearch或Solr的童鞋,对于DocValues这个词,时常出现高阶应用开发者的口中。它像一个熟悉的陌生人一样,很多人对于实现排序,分组和一些聚合类操作的需求信手拈来,但对它底层原理却了解不多。DocValues在LUCENE-3518才引入新特征,初生在Lucene4.0,由Mike(Michael McCandless)提出的。从此Lucene牛逼轰轰了。1. 为什...原创 2019-02-26 21:22:17 · 15094 阅读 · 1 评论 -
Elasticsearch 性能调优
Elasticsearch(ES)作为NOSQL+搜索引擎的有机结合体,不仅有近实时的查询能力,还具有强大的聚合分析能力。本文基于ES 5.6.4,从性能和稳定性两方面,从linux参数调优、ES节点配置和ES使用技巧三个角度入手,介绍ES调优的基本方案。当然,ES的调优绝不能一概而论,需要根据实际业务场景做适当的取舍和调整。当我们发现es使用还是非常慢,需要优先关注在以下这两类的运行情况。...原创 2019-02-26 20:17:43 · 11729 阅读 · 0 评论 -
Elasticsearch number和keyword滥用
之前有社区上反映ES 2.x -> 5.x升级对于数值类型和Term Query有重大变化。一个很简单的Query查询耗时突然从几十毫秒,变成800-1000毫秒,几十倍的性能下降。{ "from": 0, "size": 10, "query": { "bool": { "filter": [ { ...原创 2019-02-26 16:36:22 · 12861 阅读 · 1 评论 -
Elasticsearch笔记(九):实践篇-查找附近的人
到这里Elasticsearch的整个系列分享就基本上结束了,当然后续还是会针对某一点进行讲解。为何要在实践篇中讲解"查找附近的人"呢?说实话,想了很久,最终才确定下来,总体希望这个实践对今后的工作过程中有帮助。1. 需求描述随着移动设备的普及,很多移动APP都提供了LBS(Location Based Service)。其实LBS并不是什么新东西,但它也带来了不一样的改变,一方面可以提高...原创 2019-01-12 21:34:07 · 7139 阅读 · 4 评论 -
Elasticsearch笔记(八):客户端连接
本节将讲解Elasticsearch提供的Client API,而重点讲解Java API。在之前的章节中讲过《es的架构》,在这个架构图中包含了两个很重要的ES交互客户端模块:RESTful style API(HTTP REST API ,端口 9200)和Transport(TCP方式,端口 9300)。目录1. 多语言支持2.Java API2.1Node C...原创 2019-01-12 14:33:42 · 13455 阅读 · 0 评论 -
Elasticsearch笔记(七):聚合查询
聚合框架有助于根据搜索查询提供聚合数据。聚合查询是数据库中重要的功能特性,ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。聚合可以嵌套,由此可以组成复杂的操作(Bucketing聚合可以包含sub-aggregation)。聚合计算的值可以取字段的值,也可是脚本计算的结果。查...原创 2019-01-08 22:50:39 · 49297 阅读 · 4 评论 -
Elasticsearch笔记(六):Search Module
搜索允许您执行搜索查询并返回与查询匹配的搜索结果。可以使用query string as a parameter,也可以使用request body。其中request body和Query DSL功能最为强大,最为复杂。在未展开论述前,先讲会一个概念:近实时搜索。前面讲过只有get API是实时的,搜索是逐段进行的。我们都知道一个index是由若干个segment组成,随着每个segment...原创 2019-01-05 18:13:58 · 99450 阅读 · 1 评论 -
Elasticsearch笔记(五):分词器与文档管理
在上一篇中已经对索引的相关知识做了一定的讲解,本章讲重点讲解分词器与文档操作的API的相关使用。当然了,分享还是基于es 6.2.x版本展开。目录1.倒序索引2.分词器2.1 分析器的结构组成?2.2 内置分词器有哪些?2.3 什么时候使用分析器?2.4自定义分析器2.5 测试分析器2.6 控制分词器3.文档存储原理3.1 文档路由到分片流程3....原创 2019-01-03 22:53:55 · 10253 阅读 · 0 评论 -
Elasticsearch笔记(四):索引及Mapping管理
在之前的章节介绍了集群规划及管理,本章讲从索引相关的方方面面开始介绍,它包索引管理、映射详解、数据类型、元数据、索引监控相关。目录一. index1. 命名规则2.创建索引3.查看索引4.Exists5.删除索引6.索引别名7. 数据迁移Reindex8. 打开关闭索引9. 收缩索引10. 拆分索引11.Rollover Index...原创 2019-01-01 00:01:35 · 5938 阅读 · 0 评论 -
Elasticsearch笔记(三):集群规划及管理
在上一章中我们对es-search的基本架构及核心概念有了一个基本的认识,这里我们开始搭建一个集群。目录1.集群中的节点角色Ingest Node如何分配?如何避免脑裂问题?2.分片及副本3.集群健康及监控3.1 catAPI3.2Cluster API3.2.1_cluster3.2.2_nodes3.2.3_remote3.2...原创 2018-12-29 22:27:35 · 5911 阅读 · 0 评论 -
Lucene系列十:可视化工具Luke
官方介绍,luke是一个用于Lucene/Solr/Elasticsearch 搜索引擎的,方便开发和诊断的 GUI(可视化)工具。1. 功能特性查看文档、索引的词、提交记录 在索引中搜索 执行索引维护:索引运行状况检查;索引优化(运行前需要备份) 测试定制的Lucene分析工具2. 系统要求jdk8以上或者JDK113. 运行下载后,直接启动luke.bat注...原创 2018-12-28 22:21:32 · 6059 阅读 · 1 评论 -
Lucene系列七:番外篇-倒排数组合并
为何要把这一篇单独起草谈?主要是它很重要,当然了经常玩算法的基本上可以一扫而过。在上一节Lucene搜索中要实现这样的需求sql(name='alan' and name='alice' limit 0,20 )该如何处理?我们知道单个词匹配可以得到这个term的倒排链(docId列表),在数据库中使用二级索引(可能需要建立两张索引表)也是可以满足。lucene的优势在哪呢(更少IO)?问题其...原创 2018-12-28 17:24:45 · 5729 阅读 · 1 评论 -
Lucene系列九:猜你喜欢
在电商、新闻媒体等领域经常会遇到这样的需求,根据用户搜索的内容推荐它可能感兴趣的内容。为了避免话题延伸太广,什么用户画像模型及构建这些不做论述,本文仅从这类需求中挑选其中一种“找出某篇文档的相似文档,常见于类似新闻或相关文章”,这个其实就是完全是基于内容的分析,也就是相似检索。背景MoreLikeThis是Lucene的一个相似搜索组件。它产生的背景:Generate "more l...原创 2018-12-20 11:12:06 · 2124 阅读 · 0 评论 -
Elasticsearch笔记(二):架构及核心概念
在上一篇《ES简介》已经对Elasticsearch有了一个基本的了解,接下来将深入简出的了解ES的内部构造。之前讲过elasticsearch采用gateway的概念,使得完备份更加简单,gateway是个什么东西?ElasticSearch是文档型数据库,它与传统的关系型数据库有什么区别呢?目录1. ES的架构2.核心概念1.Near Realtime(NRT)2.C...原创 2018-12-15 21:01:15 · 3607 阅读 · 0 评论 -
Elasticsearch笔记(一):简介及安装
在上一章已经分享过《Solr vs Elasticsearch》,接下来几周将陆续分享我之前的学习笔记,所有内容将基于es 6.2.x版本展开。ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎。它用 Java 编写的,它的内部使用 Lucene 做索引与搜索,目的是使全文检索变得简单,设计用于云计算中,能够达到实时搜索,稳定,可靠,使用简单方便(使用J...原创 2018-12-15 19:46:12 · 2624 阅读 · 0 评论 -
Apache Solr vs Elasticsearch
我们都知道业界两个最流行的开源搜索引擎,Solr和ElasticSearch。两者都建立在Apache Lucene开源平台之上,它们的主要功能非常相似,但是在部署的易用性,可扩展性和其他功能方面也存在巨大差异。1. Apache Solr在过去的十年里,solr发展壮大,拥有广泛的用户群体。solr提供分布式索引、分片、副本集、负载均衡和自动故障转移和恢复功能。不少互联网巨头,如Netf...转载 2018-12-13 23:16:27 · 2625 阅读 · 2 评论 -
Lucene系列八:分析器详解
分析器负责对文本进行分词、语言处理得到词条,建索引和搜索的时候都需要用到分析器。Lucene的分析器往往包括一个分词器(Tokenizer)和多个过滤器(TokenFilter),过滤器负责对切出来的词进行处理,如去掉敏感词、转换大小写、转换单复数等。目录1.执行过程1.1Analyzer1.2TokenStream1.3Tokenizer1.4 TokenFilt...原创 2018-12-09 15:24:10 · 2880 阅读 · 0 评论 -
Lucene系列七:搜索过程和IndexSearcher
搜索过程是由Lucene所提供的核心功能之一。下图说明了搜索过程和使用的类。 IndexSearcher是搜索过程中最重要的和核心组件。本章的需要掌握的,了解他们的存储原理后就可以方便知道如何基于这些存储结构来实现高效的搜索。目录1.搜索的基本流程2. 底层实现原理2.1FST2.2SkipList2.3倒排合并2.4结果集排序聚合3.IndexSear...原创 2018-12-02 22:33:13 · 5153 阅读 · 1 评论 -
Lucene系列六:索引过程和IndexWriter
索引过程是由Lucene所提供的核心功能之一,而IndexWriter 是索引过程中最重要的和核心组件。目录1. 索引基本流程2. IndexWriter2.1. 关于线程安全2.2. IndexWriterConfig2.3 核心API2.4 演示实例3. 数据存储格式4. 总结1. 索引基本流程索引文件的写入顺序: fdt--->fdx -...原创 2018-11-28 18:24:31 · 6331 阅读 · 1 评论 -
Lucene系列五:Field域
为何要写这一篇呢?主要是为了补充上一篇《系统架构及核心模块》中的章节,Field是文档中的域,包括Field名和Field值两部分,一个文档可以包括多个Field,Document只是Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容。1.最基本常用属性是否分词(tokenized) 是:作分词处理,即将Field值进行分词,分词的目的是为了索引 ...原创 2018-10-19 16:50:01 · 5016 阅读 · 1 评论 -
Lucene系列四:系统架构及核心模块
在前面的一系列文章 全文检索-》反向索引 -》相关度排名 ,我们基本上已经对Lucene有了一个初步了解,知道它是什么,可以做什么,什么场景下适用。接下来将带你深入了解Lucene的构成及设计理念等。目录1.整体架构2.术语3.核心模块3.1 系统要求3.2 maven中下载3.3 Lucene模块3.4 核心对象模型4. 示例代码1.整体架构上图非...原创 2018-10-19 11:41:03 · 3102 阅读 · 0 评论 -
Lucene系列三:相关度排名
前面已经对Lucene的基本内容有一个相关的了解,特别是反向索引 ,接下来将重点介绍下相关度排名。1. 什么是相关度排名直观理解搜索结果精准由高到低如:要查询 苍老师、tony、火锅有关的新闻:含有三个关键字(相关度最高)的新闻排前面,含两个关键字(相关度次之)排次之,含一个关键字 的排次次之。当然,这是由一个算法完成的。2. 如何设计相关性模型利用出现次数来建立模型...原创 2018-10-17 15:47:56 · 2308 阅读 · 0 评论