这周优化了我们沙抖官网搜索的功能,这个搜索目前是根据视频标题进行匹配,之前是对用户输入的关键词进行了分词查找,比如用户输入【机器人】,这样的话,只要视频标题中有关键词的任意一个字都会被搜到,比如含有【人 】字的标题会展示出来,并可能排的很靠前,所以我就对当前的搜索进行了优化,现在搜索是优先进行相邻短语查询 match_phrase,如果相邻短语查询结果小于2个就进行普通的分词查询,这个相邻短语查询是要求在请求字符串中的所有查询项必须都在文档中存在 "fields": { "video_title": { } } } } 这周内我还对我们的数据表查询进行了优化 加了普通索引和联合索引,现在我们一个视频数据表的数据量是几百兆大小,根据视频行业进行查询时,mysql 响应速度在 600ms 左右,我对行业字段添加了普通索引,查询响应在 30 ms 左右,前后对比优化结果还是很明显的
例如:使用 match api 时,基于 ik_max_word 分词方式对“白色死神”进行分词后,搜索"白色"、"死神"能搜索到,而根据 "白" 进行搜索时,结果确为空。 关于严格匹配我们很容易就能想到模糊查询,es本身也是能支持模糊查询的:方案选择方案一:模糊查询 wildcard && fuzzy 模糊查询的功能有点类似 mysql 中的 like,可以使用正则表达式的通配符来达到模糊搜索的效果 ,但是当输入字符串很长或者搜索数据集很大时,搜索性能很低,原因是ES使用的是基于DFA的文本匹配算法,时间复杂度(M+N),当索引里面的数据量为K时,时间复杂度为(M+N)× K,数据量越大,输入文本越长 ###模糊查询性能数据:对2000万数据进行模糊搜索:**耗时3s+** "took" : 3714, "timed_out" : false, "_shards" : {"total" : 48, Ngram搜索性能要远远高于 wildcard,但会额外消耗10%左右磁盘(并不明显),可以配合一些数据压缩策略使用。3.
图片 背景 最近在实际项目中查询条件上越来越复杂,mysql的筛选已无法支撑,准备将所有搜索筛选改为es查询。 图片 图片 图片 具体使用方法: 第一次查询时,会生成一个 scrollId ,并将所有符合搜索条件的搜索结果缓存起来。 Scroll查询只搜索到了所有的符合条件的 doc_id (官方推荐用 doc_id 进行排序,因为本身缓存的就是 doc_id ,如果用其他字段排序会增加查询量),并将它们排序后保存在search context 创建一个时间点 Point In Time(PIT)保障搜索过程中保留特定事件点的索引状态。有了 PIT,search_after 的后续查询都是基于 PIT 视图进行,能有效保障数据的一致性。 引用文章:Elasticsearch Scroll API vs Search After with PIT 相比scroll,内存也得到了优化,es 的查询简化流程: 第一步.用户发送查询dsl
今天再来一道面试真题,es的搜索的相似度算法如何计算 首先,我们要从这几方面回答 TF(term frequency)检索词频率 IDF(inversed document frequency)反向文档频率 检索词频率 比如上面的hello在在doc1出现了1次,会根据出现的次数给个分数,一个term在doc中出现的次数越多,分数就越高 反向文档频率 找到hello在所有doc中出现的次数,比如上面出现了3次 ,一个term在所有doc 中出现的次数越多,分数就越低,比如我们的and 或the常用词,就会频繁出现,对分数的贡献就很少,所以分数就比较小 字段长度准则 hello搜索的doc长度越长,给的相关性评分越低 文档向量 比如hello world ,有3doc,其中一个doc1包含一个hello,另外一个doc2包含word,doc3包含hello world,比如下面 doc1----->[2,0] doc2 比如hello world,es会根据hello world在所有doc中的评分情况,计算一个查询向量,比如hello基于所有doc都有一个评分为2,world基于所有doc都有一个评分5,查询向量就是
有些时候,我们可能需要人工干预ES的搜索结果,让指定的内容置顶,ES提供了pinned语法来实现该功能。 "minimum_should_match" : 1 } } } }, "size" : 10, "from" : 0 } 看文档说似乎是从ES
全文搜索 1.介绍 elasticsearch 6 (和elasticsearch 5 的区别在于,root用户权限、一个库只能建立一个表) elasticsearch 6一个索引只能建立一张表 1.1 文本搜索引擎: 优点:搜索快; 缺点:占用空间。 solr需要依赖zk1. 1.2 elasticSearch(搜索引擎)的算法 倒排索引(在内容上建立索引,用内容匹配索引); btree mysql数据库的索引方式。 "name":"zhang han yu"} ] } PUT /movie_index/movie/3 { "id":3, "name":"incident red sea", 的文档(分词处理并建立了索引)之间的相关度的高低 4.ES集群 4.1 节点、分片、索引 ==节点:==一个节点就是一个es的服务器,es集群中,主节点负责集群的管理和任务的分发,一般不负责文档的增删改查
搜索是ES最最核心的内容,没有之一。前面章节的内容,索引、动态映射、分词器等都是铺垫,最重要的就是最后点击搜索这一下。下面我们就看看点击搜索这一下的背后,都做了哪些事情。 分数(score) ES的搜索结果是按照相关分数的高低进行排序的,咦?! 怎么没说搜索先说搜索结果的排序了?咱们这里先把这个概念提出来,因为在搜索的过程中,会计算这个分数。 在ES的搜索当中,分为两种,一种计算分数,而另外一种是不计算分数的。 频繁使用的过滤还会被ES加入到缓存,以提升ES的性能。下面我们看一个查询和过滤的例子,这个也是ES官网中的例子。 最后 在ES中,检索的花样是比较多的,这里也不能一一给大家介绍了,只介绍一些最基本、最常用的查询功能。下一篇我们看一下ES的聚合查询功能。
搜索是ES最最核心的内容,没有之一。前面章节的内容,索引、动态映射、分词器等都是铺垫,最重要的就是最后点击搜索这一下。下面我们就看看点击搜索这一下的背后,都做了哪些事情。 分数(score) ES的搜索结果是按照相关分数的高低进行排序的,咦?! 怎么没说搜索先说搜索结果的排序了?咱们这里先把这个概念提出来,因为在搜索的过程中,会计算这个分数。 在ES的搜索当中,分为两种,一种计算分数,而另外一种是不计算分数的。 频繁使用的过滤还会被ES加入到缓存,以提升ES的性能。下面我们看一个查询和过滤的例子,这个也是ES官网中的例子。 最后 在ES中,检索的花样是比较多的,这里也不能一一给大家介绍了,只介绍一些最基本、最常用的查询功能。下一篇我们看一下ES的聚合查询功能。
写个小文巩固下,本文主要讲 ES -> Lucene 的底层结构,然后详细描述新数据写入 ES 和 Lucene 的流程和原理。 无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库,并通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。 Elasticsearch 不仅仅是 Lucene 和全文搜索,我们还能这样去描述它: 分布式的实时文件存储,每个字段都被索引并可被搜索 分布式的实时分析搜索引擎 可以扩展到上百台服务器,处理 PB 级结构化或非结构化数据 ES 基于底层这些包,然后进行了扩展,提供了更多的更丰富的查询语句,并且通过 RESTful API 可以更方便地与底层交互。类似 ES 还有 Solr 也是基于 Lucene 实现的。 三、新文档写入流程 3.1 数据模型 如图 一个 ES Index (索引,比如商品搜索索引、订单搜索索引)集群下,有多个 Node (节点)组成。每个节点就是 ES 的实例。
本文共计6751字 预计阅读时长21分钟 导语 在上一篇文章《ES8 向量功能窥探系列(一):混合搜索功能初探与增强》中,我们初步探讨了 Elasticsearch 8.x 的混合搜索功能,包括kNN 无需任何配置,即可以直接使用到降低 70% 存储的优化特性。 4. 量化 量化是向量搜索领域,乃至 AI 模型领域的常用技术,它通过一定算法对原始向量进行压缩,得到字节数占用较小的,量化后的向量表示。 虽然该功能相对实验性,但它进一步降低了 ES 向量搜索的存储门槛,拓展了不同读写流程。后续我们仅需要对”复水“算法进行优化,即可不断弱化这一影响,从而使其得到更广泛的使用。 6. 70% 和 90% 存储的优化。 也希望更多有向量/混合搜索需求的用户,可以尝试和使用腾讯云 ES 向量搜索增强版,如果您也有独到的需求或想法,可以联系到腾讯云 ES 团队,我们将竭尽全力与您共同探索与解决。
"search"] } { "tags" : ["search", "open_source"] } 两个文档,{ "term" : { "tags" : "search" } }都能匹配,但想只搜索包含一个的值 }, { "term": { "text": "hop" }}, { "term": { "text": "leap" }} ] } } } 3、 查询时提高索引的相关性 比如说,我们es存储的是nginx的日志,昨天nginx出问题了,那么查看最近七天的日志时,为了快速找出昨天的错误,也不忽略前天的错误,那么昨天的nginx-log包含error GET /docs_2017_12_*/_search { "indices_boost": { "docs_2017_12_10": 3, "docs_2017_12_09": 2 }, "query": { "term": { "text": "error" } } } 4、更改score计算方法 ES5.0之前默认用的是tf-idf
{ "term": { "color": "yellow" } }] } } 3、 "name": "dev" } }, "sort":[ "_doc" ] } 4、随机取n条(n>=10000)数据 1)可以利用ES }, "random_score": { } } } } 2)可以利用ES "inline": "Math.random()" }, "order": "asc" } } } 3)
</artifactId> <version>2.9.9</version> </dependency> </dependencies> 2 编写方法 package com.shi.es org.elasticsearch.transport.client.PreBuiltTransportClient; import com.fasterxml.jackson.databind.ObjectMapper; /** * ES client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); // 3 .get(); System.out.println("文档添加成功..."); //关闭客户端 client.close(); } } package com.shi.es 测试 package com.shi.es; public class ClientTest { public static void main(String[] args) throws Exception
ECMAScript es3(ECMAScript 1999) 1999年,ECMAScript第三个版本 es4(ECMAScript 2007) ECMAScript第四个版本,废弃 es5(ECMAScript 在ES2015中,非对象的参数将被强制转换为一个对象。 Promises es7(ECMAScript 2016) 2016年,ECMAScript第七个版本 Array.prototype.includes() es8(ECMAScript 2017) 假设我们要遍历如下对象obj的所有值: const obj = {a: 1, b: 2, c: 3}; 不使用Object.values() :ES6 const obj = {a: 1, b: 2, () :ES8 const obj = {a: 1, b: 2, c: 3}; const values = Object.values(obj); console.log(values);//[1,
然后把半径缩短到3公里:图片可以发现,搜索到的酒店数量减少到了5家。1.5.复合查询复合(compound)查询:复合查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑。 放到filter中3)小结bool查询有几种逻辑关系? 不过,elasticsearch内部分页时,必须先查询 0~1000条,然后截取其中的990 ~ 1000的这10条:图片查询TOP1000,如果es是单点模式,这并无太大影响。 针对深度分页,ES提供了两种解决方案,官方文档:search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。 从ES7.1开始不推荐,建议用 after search方案。2.3.高亮2.3.1.高亮原理什么是高亮显示呢?
在Elasticsearch 8.18和9.0版本中,ES|QL增加了许多新功能,包括:支持评分语义搜索匹配功能的更多配置选项新的KQL功能在这篇博客中,我们将回顾这些8.18版本的功能以及计划添加到ES |QL中的其他令人兴奋的新功能,以加强我们在将ES|QL打造成现代搜索语言方面的投入。 只需将索引字段映射为semantic_text,即可为语义搜索设置您的索引。查看我们的语义文本搜索教程以获取更多详细信息。使用ES|QL进行混合搜索ES|QL使得同时进行语义和词法搜索变得简单。 超越8.18和9.0在未来的版本中,我们将为ES|QL增加更多的搜索功能,包括向量搜索、语义重排序、增强的评分自定义选项以及组合混合搜索结果的附加方法,如互惠等级融合(RRF)。 跟随在ES|QL中进行搜索和过滤的教程,进行一次对本文所述功能的实践介绍!
终结状态可能是成功解决了问题,那么我们发现了问题的一个解;也可能是没有解决问题,但是后面无路可走了,那么说明说我们之前做的决策有错误 深度优先搜索可以用来遍历所有选择,找到所有的终结状态,从而找到所有的解 例如f1=2表示从1滑动到3需要先经过2;特别的fi=0表示从i到j没有限制 这个f数组是这样的,其余的f值是0: f[1][3] = f[3][1] = 2; f[1][7] = f[7][1] = 4; f[1][9] = f[9][1] = f[2][8] = f[8][2] = f[4][6] = f[6][4] = f[3][7] = f[7][3] = 5; f[3][9] = f[9 ][3] = 6; f[7][9] = f[9][7] = 8; 然后就是深度优先搜索的过程。 [4] = f[3][7] = f[7][3] = 5; f[3][9] = f[9][3] = 6; f[7][9] = f[9][7] = 8; cin >> t;
一、 背景 Elasticsearch是一个基于Lucene库的开源搜索引擎,简称ES。 在Composite 聚合的场景下,腾讯云ES 也基于CBO 策略对高基数的聚合场景进行了优化,在高基数场景下跳过构建缓存。 3. 其次需要关注是否有长耗时的查询任务 跟查询拒绝率,当这些指标出现异常时,说明大概率出现了大查询,导致查询线程池长期被占用,需要分析大查询并进行优化。 3. 当客户端发生流量倾斜后,ES 默认会对发送到该可用区的查询,会优先查该可用区的副本,旨在减少搜索延迟,但这个机制在高并发场景下也可能会导致可用区查询流量不均。 7.9 优化了多层嵌套聚合所消耗的内存。 7.0 通过计算跳过不必要的记录,查询大量文档的top N 性能提升3-7倍。
然而,ES有个众所周知的‘硬伤’:一旦字段的mapping设定,就无法直接修改! 这意味着每次模型升级带来的字段调整,都绕不开一个耗时费力的过程——重建索引并迁移数据(Reindex)。 ,并巧妙运用Alias(别名)实现线上搜索服务的无缝切换,让你的索引升级从此优雅从容。1. 在我们的数据集上,使用以下操作后再进行reindex能有接近3倍的速度提升,千万量级的索引,可以在2~3个小时刷完。关闭副本分片 (释放写入压力):副本分片是主分片的完整拷贝,用于数据冗余和高可用。 而reindex阶段数据不需要倍搜索到因此可以关闭,迁移完成后,请务必恢复此设置,否则数据不会刷新PUT new_index/_settings{ "refresh_interval": -1 # reindex 下次当你面对恼人的ES mapping变更时,不必再头疼停机窗口和漫长的等待时间了。用好这些技巧,让你的索引升级变得高效且优雅吧!
当你商户信息在本地搜索找不到的时候,就要考虑做本地优化,服务于大型商业区,但你的企业实际上位于该地区的边缘。 本地搜索优化实际操作中遇到的问题 人们在寻找私人牙医时看到的地图,一个牙医所在的城市本身很有名,但是搜索结果排名并没有给他们显示在好排名的位置,如果牙医的位置错误,就很难获得展示,这是本地商户系统真正的弱点 本地搜索优化技巧 通过优化自然搜索页面来改善本地搜索排名,在之前讲座中解释了搜索引擎本地商户列表与网站相关联,下面是本地搜索优化的技巧: 一、自然优化可能有助于本地列表 你的网站排名越好,自然搜索结果排的位置越好 二、优化页面 在页面重要位置带上地理位置的关键词,外链锚文本通常是位置+关键字。 五、谷歌活动搜索优化 可以根据地址将事件与特定业务相关联,谷歌则会将事件信息放到本地商户列表中,或者用户搜索活动信息的时候显示在搜索结果中。