这周优化了我们沙抖官网搜索的功能,这个搜索目前是根据视频标题进行匹配,之前是对用户输入的关键词进行了分词查找,比如用户输入【机器人】,这样的话,只要视频标题中有关键词的任意一个字都会被搜到,比如含有【人 】字的标题会展示出来,并可能排的很靠前,所以我就对当前的搜索进行了优化,现在搜索是优先进行相邻短语查询 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,数据量越大,输入文本越长 token" : "菜", "start_offset" : 2, "end_offset" : 3, "type" : "word", "position" : 5 ], "min_gram": "1", // 按需修改 "type": "ngram", "max_gram": "5"
图片 背景 最近在实际项目中查询条件上越来越复杂,mysql的筛选已无法支撑,准备将所有搜索筛选改为es查询。 图片 图片 图片 具体使用方法: 第一次查询时,会生成一个 scrollId ,并将所有符合搜索条件的搜索结果缓存起来。 search.Size(1000) // 7.0版本命中数 search.TrackTotalHits(true) // 第一次调用,传入scrollId空字符串, scrollTime 5s , 获取 esResult.ScrollId // 后续调用,传入 esResult.ScrollId, 5m, 直到命中数组长度为0即可 search.ScrollId(scrollId) 引用文章:Elasticsearch Scroll API vs Search After with PIT 相比scroll,内存也得到了优化,es 的查询简化流程: 第一步.用户发送查询dsl
《Spring Boot 2.0 整合 ES 5 文章内容搜索实战》 本章内容 文章内容搜索思路 搜索内容分词 搜索查询语句 筛选条件 分页、排序条件 小结 阅读时间:8 分钟 摘录:人这一辈子,得到多少是多 ,怎样是过得好或者不好,其实并没有定义,关键你自己心里是怎么想的,要的太多,就不会幸福 一、文章内容搜索思路 上一篇讲了在怎么在 Spring Boot 2.0 上整合 ES 5 ,这一篇聊聊具体实战。 因为内容搜索关注内容的连接性。所以这里处理方法比较 low ,希望多交流一起实现更好的搜索方法。就是通过分词得到很多短语,然后利用短语进行短语精准匹配。 ES 安装 IK 分词器插件很简单。 最后重启 ES 即可。 二、搜索内容分词 安装好 IK ,如何调用呢? 第一步,我这边搜搜内容会以 逗号 拼接传入。 这是个 bug 第三步,利用 AnalyzeRequestBuilder 对象获取 IK 分词后的返回值对象列表 第四步,优化分词结果,比如都为词,则保留全部;有词有字,则保留词;只有字,则保留字 核心实现代码如下
今天再来一道面试真题,es的搜索的相似度算法如何计算 首先,我们要从这几方面回答 TF(term frequency)检索词频率 IDF(inversed document frequency)反向文档频率 中出现的次数,比如上面出现了3次,一个term在所有doc 中出现的次数越多,分数就越低,比如我们的and 或the常用词,就会频繁出现,对分数的贡献就很少,所以分数就比较小 字段长度准则 hello搜索的 hello world ,有3doc,其中一个doc1包含一个hello,另外一个doc2包含word,doc3包含hello world,比如下面 doc1----->[2,0] doc2----->[0,5] doc3----->[2,5] 每一个doc都会计算出term计算出一个分数,hello 一个分数,world一个分数,都会计算出一个分数组,所有的分数组形成一个文档向量 查询向量 比如hello world ,es会根据hello world在所有doc中的评分情况,计算一个查询向量,比如hello基于所有doc都有一个评分为2,world基于所有doc都有一个评分5,查询向量就是[2,5] 计算相似度
有些时候,我们可能需要人工干预ES的搜索结果,让指定的内容置顶,ES提供了pinned语法来实现该功能。 "minimum_should_match" : 1 } } } }, "size" : 10, "from" : 0 } 看文档说似乎是从ES
npm init -y 首先安装babel组件 npm install @babel/cli @babel/core @babel/preset-env babel-plugin-transform-es2015 配置babel,.babelrc(babel配置文件) { "presets": [ "@babel/preset-env" ], "plugins": ["transform-es2015 babel命令 "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "babel": "babel es6 .js -o es5.js" }, 配置完成之后,执行命令即可 npm run babel 效果 根目录下的es6.js export class A { a = 0 constructor setA(v) { this.a = v } } const a = new A() a.setA(10) console.log(a); 执行npm run babel后,根目录生成es5
情景问题 项目有很多新的 js 语法 es6 es7 等等 如你所愿市面上很多浏览器已经大部分支持这些与语法了 但是 ie 就差强人意了 直接歇菜 如何解决 利用 node 插件完成语法降级 实施情景 在一些 ES2015+ 语法不支持的环境下,每个需要用到 Polyfill 的引用时,会自动加上 }, ] ] } # 命令行转码 npm install --save-dev @babel/cli 复制到源项目下 \cp -r lib/js/business /root/my-project/src/main/resources/static/js packson.json { "name": "es6 -es5", "version": "1.0.0", "description": "es6 transform es5", "main": "index.js", "scripts": { "test
es6转码es5 一.Babel 在线转码 二.谷歌的Traceur 在线转码 三.es6console 在线转码并运行 四.Traceur 在页面中引入使用 //加载 Traceur 文件 <script 五. node中使用Traceur 1.首先需要用安装 npm install -g traceur 2.运行es6文件 traceur 文件名.js 3.将es6转为es5 traceur --script 文件名.es6.js --out 文件名.es5.js 4.防止出现问题最好加上实验选项 --experimental traceur --script 文件名.es6.js --out 文件名.es5 .js --experimental 六. node中使用Babel 1.安装 npm install --global babel 2.运行es6文件 babel-node 文件名.js 3.将es6 转为es5 babel 文件名.js 或者指定转换后的es5文件名 babel es6文件名.js -o es5文件名.js 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。
为什么要es6转es5? 答:es6代码在老版本的浏览器中无法执行。 怎么将es6代码转为es5代码,让其在老版本的浏览器中执行? 答:使用babel模块,babel是一个使用非常广泛的es6转换器,这就意味着我们可以将es6代码转为es5代码,从而在老版本的浏览器中执行。 使用步骤: 新建一个新的用来编写es6代码的文件夹,进入到该文件中,初始化一个项目 npm init 表示一步步通过配置来初始化一个项目 npm init -y 表示使用默认设置来快速初始化一个项目 out-file b.js –out-file 或 -o 参数指定输出文件 babel src --out-dir dist –out-dir 或 -d 参数指定输出目录 实例: //转化之前为es6 Iterator、Generator、Set、Map、Proxy、Reflect、Symbol、Promise等全局对象,以及定义在全局对象上的方法(比如Object.assign)都不会转码 举例来说,ES6
全文搜索 1.介绍 elasticsearch 6 (和elasticsearch 5 的区别在于,root用户权限、一个库只能建立一个表) elasticsearch 6一个索引只能建立一张表 1.1 文本搜索引擎: 优点:搜索快; 缺点:占用空间。 solr需要依赖zk1. 1.2 elasticSearch(搜索引擎)的算法 倒排索引(在内容上建立索引,用内容匹配索引); btree mysql数据库的索引方式。 node 集群中的一个节点,一般只一个进程就是一个node shard 分片,即使是一个节点中的数据也会通过hash算法,分成多个片存放,默认是5片。 GET /movie_index/_search { "took": 6, "timed_out": false, "_shards": { "total": 5,
搜索是ES最最核心的内容,没有之一。前面章节的内容,索引、动态映射、分词器等都是铺垫,最重要的就是最后点击搜索这一下。下面我们就看看点击搜索这一下的背后,都做了哪些事情。 分数(score) ES的搜索结果是按照相关分数的高低进行排序的,咦?! 怎么没说搜索先说搜索结果的排序了?咱们这里先把这个概念提出来,因为在搜索的过程中,会计算这个分数。 在ES的搜索当中,分为两种,一种计算分数,而另外一种是不计算分数的。 频繁使用的过滤还会被ES加入到缓存,以提升ES的性能。下面我们看一个查询和过滤的例子,这个也是ES官网中的例子。 最后 在ES中,检索的花样是比较多的,这里也不能一一给大家介绍了,只介绍一些最基本、最常用的查询功能。下一篇我们看一下ES的聚合查询功能。
搜索是ES最最核心的内容,没有之一。前面章节的内容,索引、动态映射、分词器等都是铺垫,最重要的就是最后点击搜索这一下。下面我们就看看点击搜索这一下的背后,都做了哪些事情。 分数(score) ES的搜索结果是按照相关分数的高低进行排序的,咦?! 怎么没说搜索先说搜索结果的排序了?咱们这里先把这个概念提出来,因为在搜索的过程中,会计算这个分数。 在ES的搜索当中,分为两种,一种计算分数,而另外一种是不计算分数的。 频繁使用的过滤还会被ES加入到缓存,以提升ES的性能。下面我们看一个查询和过滤的例子,这个也是ES官网中的例子。 最后 在ES中,检索的花样是比较多的,这里也不能一一给大家介绍了,只介绍一些最基本、最常用的查询功能。下一篇我们看一下ES的聚合查询功能。
写个小文巩固下,本文主要讲 ES -> Lucene 的底层结构,然后详细描述新数据写入 ES 和 Lucene 的流程和原理。 Elasticsearch 不仅仅是 Lucene 和全文搜索,我们还能这样去描述它: 分布式的实时文件存储,每个字段都被索引并可被搜索 分布式的实时分析搜索引擎 可以扩展到上百台服务器,处理 PB 级结构化或非结构化数据 ES 基于底层这些包,然后进行了扩展,提供了更多的更丰富的查询语句,并且通过 RESTful API 可以更方便地与底层交互。类似 ES 还有 Solr 也是基于 Lucene 实现的。 三、新文档写入流程 3.1 数据模型 如图 一个 ES Index (索引,比如商品搜索索引、订单搜索索引)集群下,有多个 Node (节点)组成。每个节点就是 ES 的实例。 一般建议稍微延长这个 refresh 时间间隔,比如 5 s。因此,ES 其实就是准实时,达不到真正的实时。
深度优先搜索一般是递归实现的,搜索过程中总是优先遍历当前节点的子节点。 从这一节开始,我们将学习广(宽)度优先搜索 这个GIF图中,节点被染成绿色的顺序表示在宽度优先搜索过程中节点被访问的顺序。 于是依次访问这两个节点,同时在访问时,我们发现了节点2的儿子节点4和5,以及节点3的儿子节点6和7,将这4个节点记录下来 当完成第二层的访问后,继续根据记录来依次访问节点4~7,也对应了图中的第三层节点 由于这些节点都不包含有子节点,不会再增加记录的节点数量,因此访问完成后退出搜索 在上面的过程中我们发现以下两个事实: 广度优先搜索的顺序与子节点到初始节点的距离有关,离初始节点越近的子节点会更早被访问 根据题目描述,我们可以知道以下几个信息: 该图中需要搜索的节点为格子,我们用坐标[x,y]来表示格子 若将相邻格子的距离视为1,搜索目标为[1,1]到[n,m]的最短路径 墙壁的格子是不能进入的,因此在搜索过程中需要进行判定
首先需要安装依赖环境 npm i –save-dev babel-cli babel-preset 安装es5转换 npm i –save-dev babel-preset-es2015 安装polyfill 安装运行时转换 npm i –save-dev babel-plugin-transform-runtime babel-runtime 编写.babelrc文件 { "presets": [ "es2015 " ], "plugins": [] } 如果需要兼容IE下的promise,需要引入如下脚本 第一个shim是为了可以让一些低级的浏览器支持最新的ecmascript5的一些特性 第二个polyfill <script src="https://cdnjs.cloudflare.com/ajax/libs/<em>es</em><em>5</em>-shim/4.5.7/<em>es</em><em>5</em>-shim.min.js" ></script> <script cdn.polyfill.io/v2/polyfill.min.js" ></script> 如果还有报错比如IE下的Array.from方法报错,添加如下兼容性脚本 { "presets": [ "es2015
本文共计6751字 预计阅读时长21分钟 导语 在上一篇文章《ES8 向量功能窥探系列(一):混合搜索功能初探与增强》中,我们初步探讨了 Elasticsearch 8.x 的混合搜索功能,包括kNN 无需任何配置,即可以直接使用到降低 70% 存储的优化特性。 4. 量化 量化是向量搜索领域,乃至 AI 模型领域的常用技术,它通过一定算法对原始向量进行压缩,得到字节数占用较小的,量化后的向量表示。 5. 量化裁剪优化 5.1 发现进一步的冗余存储 在进行了行存裁剪后,我们发现存储的大头不再是.fdt,而是变成了.vec。 虽然该功能相对实验性,但它进一步降低了 ES 向量搜索的存储门槛,拓展了不同读写流程。后续我们仅需要对”复水“算法进行优化,即可不断弱化这一影响,从而使其得到更广泛的使用。 6. 也希望更多有向量/混合搜索需求的用户,可以尝试和使用腾讯云 ES 向量搜索增强版,如果您也有独到的需求或想法,可以联系到腾讯云 ES 团队,我们将竭尽全力与您共同探索与解决。
"search"] } { "tags" : ["search", "open_source"] } 两个文档,{ "term" : { "tags" : "search" } }都能匹配,但想只搜索包含一个的值 { "text": "hop" }}, { "term": { "text": "leap" }} ] } } } 3、查询时提高索引的相关性 比如说,我们es docs_2017_12_09": 2 }, "query": { "term": { "text": "error" } } } 4、更改score计算方法 ES5.0 5、针对数组字符串,match_phrase匹配不准确 PUT /my_index/groups/1 { "names": [ "John Abraham", "Lincoln Smith"]
"name": "dev" } }, "sort":[ "_doc" ] } 4、随机取n条(n>=10000)数据 1)可以利用ES }, "random_score": { } } } } 2)可以利用ES { "term": { "name": "dev" } }, "sort":[ "mark" ] } 5、 pretty -d'{ "size": 5, "query": { "bool": { "must": { "script
</artifactId> <version>2.9.9</version> </dependency> </dependencies> 2 编写方法 package com.shi.es .get(); System.out.println("文档添加成功..."); //关闭客户端 client.close(); } } package com.shi.es "index_client") .setTypes("content") .setQuery(builder) .setFrom(0) //起始行数 .setSize(5) "index_client") .setTypes("content") .setQuery(builder) .setFrom(0) //起始行数 .setSize(5) //每一页显示的数量 .highlighter(highlightBuilder)//设置高亮显示 .get(); //5 取查询结果 SearchHits searchHits