最新要闻
- 百事通!成了!微信:视频号用户总使用时长接近朋友圈80%
- 天天要闻:开袋即食 一口弹牙 大牌优形肉肠0.99元/根(商超2.5元)
- 快资讯:期待!《生化危机4:重制版》威斯克或将登场
- 特斯拉门店:降价维权后销量翻倍!全国一天提车量超1万台
- 2023支付宝集五福最全攻略 神秘玩法千万别错过
- 琥珀银杏果是什么东西?琥珀银杏果是什么地方的菜?
- 兵长一米六是什么意思?兵长一米六顺口溜
- 美髯公指的是谁?美髯公是什么意思?
- 金坷垃是什么意思?金坷垃是什么时候的梗?
- 肥皂水是碱性还是酸性?肥皂水的主要化学成分是什么?
- 主角叫萧破天的小说有哪些?主角叫萧破天的全部小说
- 转世仁波切是什么意思?转世仁波切怎么认证?
- 电信拨打长途前面加什么?电信拨打长途要钱吗?
- dnf武极觉醒技能怎么点?DNF武极觉醒技能介绍
- 倒角外倒角内倒角怎么区分?倒角外倒角内倒角的区别有哪些?
- 申怡走进云南白沙湾小学开讲公益语文课 用语文点亮希望的灯火
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
ElasticSearch必知必会-基础篇
商业发展与职能技术部-体验保障研发组 康睿 姚再毅 李振 刘斌 王北永
说明:以下全部均基于eslaticsearch 8.1 版本
一.索引的定义
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/indices.html
索引的全局认知
ElasticSearch | Mysql |
---|---|
Index | Table |
Type废弃 | Table废弃 |
Document | Row |
Field | Column |
Mapping | Schema |
Everything is indexed | Index |
Query DSL | SQL |
GET http://... | select * from |
POST http://... | update table set ... |
Aggregations | group by\sum\sum |
cardinality | 去重 distinct |
reindex | 数据迁移 |
索引的定义
定义: 相同文档结构(Mapping)文档的结合 由唯一索引名称标定 一个集群中有多个索引 不同的索引代表不同的业务类型数据 注意事项: 索引名称不支持大写 索引名称最大支持255个字符长度 字段的名称,支持大写,不过建议全部统一小写
(资料图片)
索引的创建
index-settings 参数解析
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/index-modules.html
注意: 静态参数索引创建后,不再可以修改,动态参数可以修改 思考: 一、为什么主分片创建后不可修改? A document is routed to a particular shard in an index using the following formula:
索引的基本操作
二.Mapping-Param之dynamic
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/dynamic.html
核心功能
自动检测字段类型后添加字段 也就是哪怕你没有在es的mapping中定义该字段,es也会动态的帮你检测字段类型
初识dynamic
// 删除test01索引,保证这个索引现在是干净的DELETE test01// 不定义mapping,直接一条插入数据试试看,POST test01/_doc/1{ "name":"kangrui10"}// 然后我们查看test01该索引的mapping结构 看看name这个字段被定义成了什么类型// 由此可以看出,name一级为text类型,二级定义为keyword,但其实这并不是我们想要的结果,// 我们业务查询中name字段并不会被分词查询,一般都是全匹配(and name = xxx)// 以下的这种结果,我们想要实现全匹配 就需要 name.keyword = xxx 反而麻烦GET test01/_mapping{ "test01" : { "mappings" : { "properties" : { "name" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } } } } }}
dynamic的可选值
可选值 | 说明 | 解释 |
---|---|---|
true | New fields are added to the mapping (default). | 创建mapping时,如果不指定dynamic的值,默认true,即如果你的字段没有收到指定类型,就会es帮你动态匹配字段类型 |
false | New fields are ignored. These fields will not be indexed or searchable, but will still appear in the _source field of returned hits. These fields will not be added to the mapping, and new fields must be added explicitly. | 若设置为false,如果你的字段没有在es的mapping中创建,那么新的字段,一样可以写入,但是不能被查询,mapping中也不会有这个字段,也就是被写入的字段,不会被创建索引 |
strict | If new fields are detected, an exception is thrown and the document is rejected. New fields must be explicitly added to the mapping. | 若设置为strict,如果新的字段,没有在mapping中创建字段,添加会直接报错,生产环境推荐,更加严谨。示例如下,如要新增字段,就必须手动的新增字段 |
动态映射的弊端
- 字段匹配相对准确,但不一定是用户期望的
- 比如现在有一个text字段,es只会给你设置为默认的standard分词器,但我们一般需要的是ik中文分词器
- 占用多余的存储空间
- string类型匹配为text和keyword两种类型,意味着会占用更多的存储空间
- mapping爆炸
- 如果不小心写错了查询语句,get用成了put误操作,就会错误创建很多字段
三.Mapping-Param之doc_values
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/doc-values.html
核心功能
DocValue其实是Lucene在构建倒排索引时,会额外建立一个有序的正排索引(基于document => field value的映射列表) DocValue本质上是一个序列化的 列式存储,这个结构非常适用于聚合(aggregations)、排序(Sorting)、脚本(scripts access to field)等操作。而且,这种存储方式也非常便于压缩,特别是数字类型。这样可以减少磁盘空间并且提高访问速度。 几乎所有字段类型都支持DocValue,除了text和annotated_text字段。
何为正排索引
正排索引其实就是类似于数据库表,通过id和数据进行关联,通过搜索文档id,来获取对应的数据
doc_values可选值
- true:默认值,默认开启
- false:需手动指定,设置为false后,sort、aggregate、access the field from script将会无法使用,但会节省磁盘空间
真题演练
// 创建一个索引,test03,字段满足以下条件// 1. speaker: keyword// 2. line_id: keyword and not aggregateable// 3. speech_number: integerPUT test03{ "mappings": { "properties": { "speaker": { "type": "keyword" }, "line_id":{ "type": "keyword", "doc_values": false }, "speech_number":{ "type": "integer" } } }}
四.分词器analyzers
ik中文分词器安装
https://github.com/medcl/elasticsearch-analysis-ik
何为倒排索引
数据索引化的过程
分词器的分类
官网地址: https://www.elastic.co/guide/en/elasticsearch/reference/8.1/analysis-analyzers.html
五.自定义分词
自定义分词器三段论
1.Character filters 字符过滤
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/analysis-charfilters.html 可配置0个或多个
HTML Strip Character Filter:用途:删除HTML元素,如 ,并解 码HTML实体,如&amp
Mapping Character Filter:用途:替换指定字符
Pattern Replace Character Filter:用途:基于正则表达式替换指定字符
2.Tokenizer 文本切为分词
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/analysis-tokenizers.html#_word_oriented_tokenizers 只能配置一个 用分词器对文本进行分词
3.Token filters 分词后再过滤
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/analysis-tokenfilters.html 可配置0个或多个 分词后再加工,比如转小写、删除某些特殊的停用词、增加同义词等
真题演练
有一个文档,内容类似 dag & cat, 要求索引这个文档,并且使用match_parase_query, 查询dag & cat 或者 dag and cat,都能够查到 题目分析: 1.何为match_parase_query:match_phrase 会将检索关键词分词。match_phrase的分词结果必须在被检索字段的分词中都包含,而且顺序必须相同,而且默认必须都是连续的。 2.要实现 & 和 and 查询结果要等价,那么就需要自定义分词器来实现了,定制化的需求 3.如何自定义一个分词器:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/analysis-custom-analyzer.html 4.解法1核心使用功能点,Mapping Character Filter 5.解法2核心使用功能点,https://www.elastic.co/guide/en/elasticsearch/reference/8.1/analysis-synonym-tokenfilter.html
解法1
# 新建索引PUT /test01{ "settings": { "analysis": { "analyzer": { "my_analyzer": { "char_filter": [ "my_mappings_char_filter" ], "tokenizer": "standard", } }, "char_filter": { "my_mappings_char_filter": { "type": "mapping", "mappings": [ "& => and" ] } } } }, "mappings": { "properties": { "content":{ "type": "text", "analyzer": "my_analyzer" } } }}// 说明// 三段论之Character filters,使用char_filter进行文本替换// 三段论之Token filters,使用默认分词器// 三段论之Token filters,未设定// 字段content 使用自定义分词器my_analyzer# 填充测试数据PUT test01/_bulk{"index":{"_id":1}}{"content":"doc & cat"}{"index":{"_id":2}}{"content":"doc and cat"}# 执行测试,doc & cat || oc and cat 结果输出都为两条POST test01/_search{ "query": { "bool": { "must": [ { "match_phrase": { "content": "doc & cat" } } ] } }}
解法2
# 解题思路,将& 和 and 设定为同义词,使用Token filters# 创建索引PUT /test02{ "settings": { "analysis": { "analyzer": { "my_synonym_analyzer": { "tokenizer": "whitespace", "filter": [ "my_synonym" ] } }, "filter": { "my_synonym": { "type": "synonym", "lenient": true, "synonyms": [ "& => and" ] } } } }, "mappings": { "properties": { "content": { "type": "text", "analyzer": "my_synonym_analyzer" } } }}// 说明// 三段论之Character filters,未设定// 三段论之Token filters,使用whitespace空格分词器,为什么不用默认分词器?因为默认分词器会把&分词后剔除了,就无法在去做分词后的过滤操作了// 三段论之Token filters,使用synony分词后过滤器,对&和and做同义词// 字段content 使用自定义分词器my_synonym_analyzer# 填充测试数据PUT test02/_bulk{"index":{"_id":1}}{"content":"doc & cat"}{"index":{"_id":2}}{"content":"doc and cat"}# 执行测试POST test02/_search{ "query": { "bool": { "must": [ { "match_phrase": { "content": "doc & cat" } } ] } }}
六.multi-fields
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/multi-fields.html
// 单字段多类型,比如一个字段我想设置两种分词器PUT my-index-000001{ "mappings": { "properties": { "city": { "type": "text", "analyzer":"standard", "fields": { "fieldText": { "type": "text", "analyzer":"ik_smart", } } } } }}
七.runtime_field 运行时字段
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/runtime.html
产生背景
假如业务中需要根据某两个数字类型字段的差值来排序,也就是我需要一个不存在的字段, 那么此时应该怎么办? 当然你可以刷数,新增一个差值结果字段来实现,假如此时不允许你刷数新增字段怎么办?
解决方案
应用场景
- 在不重新建立索引的情况下,向现有文档新增字段
- 在不了解数据结构的情况下处理数据
- 在查询时覆盖从原索引字段返回的值
- 为特定用途定义字段而不修改底层架构
功能特性
- Lucene完全无感知,因没有被索引化,没有doc_values
- 不支持评分,因为没有倒排索引
- 打破传统先定义后使用的方式
- 能阻止mapping爆炸
- 增加了API的灵活性
- 注意,会使得搜索变慢
实际使用
- 运行时检索指定,即检索环节可使用(也就是哪怕mapping中没有这个字段,我也可以查询)
- 动态或静态mapping指定,即mapping环节可使用(也就是在mapping中添加一个运行时的字段)
真题演练1
# 假定有以下索引和数据PUT test03{ "mappings": { "properties": { "emotion": { "type": "integer" } } }}POST test03/_bulk{"index":{"_id":1}}{"emotion":2}{"index":{"_id":2}}{"emotion":5}{"index":{"_id":3}}{"emotion":10}{"index":{"_id":4}}{"emotion":3}# 要求:emotion > 5, 返回emotion_falg = "1", # 要求:emotion < 5, 返回emotion_falg = "-1", # 要求:emotion = 5, 返回emotion_falg = "0",
解法1
检索时指定运行时字段: https://www.elastic.co/guide/en/elasticsearch/reference/8.1/runtime-search-request.html 该字段本质上是不存在的,所以需要检索时要加上 fields *
GET test03/_search{ "fields": [ "*" ], "runtime_mappings": { "emotion_falg": { "type": "keyword", "script": { "source": """ if(doc["emotion"].value>5)emit("1"); if(doc["emotion"].value<5)emit("-1"); if(doc["emotion"].value==5)emit("0"); """ } } }}
解法2
创建索引时指定运行时字段:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/runtime-mapping-fields.html 该方式支持通过运行时字段做检索
# 创建索引并指定运行时字段PUT test03_01{ "mappings": { "runtime": { "emotion_falg": { "type": "keyword", "script": { "source": """ if(doc["emotion"].value>5)emit("1"); if(doc["emotion"].value<5)emit("-1"); if(doc["emotion"].value==5)emit("0"); """ } } }, "properties": { "emotion": { "type": "integer" } } }}# 导入测试数据POST test03_01/_bulk{"index":{"_id":1}}{"emotion":2}{"index":{"_id":2}}{"emotion":5}{"index":{"_id":3}}{"emotion":10}{"index":{"_id":4}}{"emotion":3}# 查询测试GET test03_01/_search{ "fields": [ "*" ]}
真题演练2
# 有以下索引和数据PUT test04{ "mappings": { "properties": { "A":{ "type": "long" }, "B":{ "type": "long" } } }}PUT task04/_bulk{"index":{"_id":1}}{"A":100,"B":2}{"index":{"_id":2}}{"A":120,"B":2}{"index":{"_id":3}}{"A":120,"B":25}{"index":{"_id":4}}{"A":21,"B":25}# 需求:在task04索引里,创建一个runtime字段,其值是A-B,名称为A_B; 创建一个range聚合,分为三级:小于0,0-100,100以上;返回文档数// 使用知识点:// 1.检索时指定运行时字段: https://www.elastic.co/guide/en/elasticsearch/reference/8.1/runtime-search-request.html// 2.范围聚合 https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-aggregations-bucket-range-aggregation.html
解法
# 结果测试GET task04/_search{ "fields": [ "*" ], "size": 0, "runtime_mappings": { "A_B": { "type": "long", "script": { "source": """ emit(doc["A"].value - doc["B"].value); """ } } }, "aggs": { "price_ranges_A_B": { "range": { "field": "A_B", "ranges": [ { "to": 0 }, { "from": 0, "to": 100 }, { "from": 100 } ] } } }}
八.Search-highlighted
highlighted语法初识
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/highlighting.html
九.Search-Order
Order语法初识
官网文档地址: https://www.elastic.co/guide/en/elasticsearch/reference/8.1/sort-search-results.html
// 注意:text类型默认是不能排或聚合的,如果非要排序或聚合,需要开启fielddataGET /kibana_sample_data_ecommerce/_search{ "query": { "match": { "customer_last_name": "wood" } }, "highlight": { "number_of_fragments": 3, "fragment_size": 150, "fields": { "customer_last_name": { "pre_tags": [ "" ], "post_tags": [ "" ] } } }, "sort": [ { "currency": { "order": "desc" }, "_score": { "order": "asc" } } ]}
十.Search-Page
page语法初识
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/paginate-search-results.html
# 注意 from的起始值是 0 不是 1GET kibana_sample_data_ecommerce/_search{ "from": 5, "size": 20, "query": { "match": { "customer_last_name": "wood" } }}
真题演练1
# 题目In the spoken lines of the play, highlight the word Hamlet (int the text_entry field) startint the highlihnt with "#aaa#" and ending it with "#bbb#"return all of speech_number field lines in reverse order; "20" speech lines per page,starting from line "40"# highlight 处理 text_entry 字段 ; 关键词 Hamlet 高亮# page分页:from:40;size:20# speech_number:倒序POST test09/_search{ "from": 40, "size": 20, "query": { "bool": { "must": [ { "match": { "text_entry": "Hamlet" } } ] } }, "highlight": { "fields": { "text_entry": { "pre_tags": [ "#aaa#" ], "post_tags": [ "#bbb#" ] } } }, "sort": [ { "speech_number.keyword": { "order": "desc" } } ]}
十一.Search-AsyncSearch
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/async-search.html
发行版本
7.7.0
适用场景
允许用户在异步搜索结果时可以检索,从而消除了仅在查询完成后才等待最终响应的情况
常用命令
- 执行异步检索
- POST /sales*/_async_search?size=0
- 查看异步检索
- GET /_async_search/id值
- 查看异步检索状态
- GET /_async_search/id值
- 删除、终止异步检索
- DELETE /_async_search/id值
异步查询结果说明
返回值 | 含义 |
---|---|
id | 异步检索返回的唯一标识符 |
is_partial | 当查询不再运行时,指示再所有分片上搜索是成功还是失败。在执行查询时,is_partial=true |
is_running | 搜索是否仍然再执行 |
total | 将在多少分片上执行搜索 |
successful | 有多少分片已经成功完成搜索 |
十二.Aliases索引别名
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/aliases.html
Aliases的作用
在ES中,索引别名(index aliases)就像一个快捷方式或软连接,可以指向一个或多个索引。别名带给我们极大的灵活性,我们可以使用索引别名实现以下功能:
- 在一个运行中的ES集群中无缝的切换一个索引到另一个索引上(无需停机)
- 分组多个索引,比如按月创建的索引,我们可以通过别名构造出一个最近3个月的索引
- 查询一个索引里面的部分数据构成一个类似数据库的视图(views
假设没有别名,如何处理多索引的检索
方式1:POST index_01,index_02.index_03/_search 方式2:POST index*/search
创建别名的三种方式
- 创建索引的同时指定别名
# 指定test05的别名为 test05_aliasesPUT test05{ "mappings": { "properties": { "name":{ "type": "keyword" } } }, "aliases": { "test05_aliases": {} }}
- 使用索引模板的方式指定别名
PUT _index_template/template_1{ "index_patterns": ["te*", "bar*"], "template": { "settings": { "number_of_shards": 1 }, "mappings": { "_source": { "enabled": true }, "properties": { "host_name": { "type": "keyword" }, "created_at": { "type": "date", "format": "EEE MMM dd HH:mm:ss Z yyyy" } } }, "aliases": { "mydata": { } } }, "priority": 500, "composed_of": ["component_template1", "runtime_component_template"], "version": 3, "_meta": { "description": "my custom" }}
- 对已有的索引创建别名
POST _aliases{ "actions": [ { "add": { "index": "logs-nginx.access-prod", "alias": "logs" } } ]}
删除别名
POST _aliases{ "actions": [ { "remove": { "index": "logs-nginx.access-prod", "alias": "logs" } } ]}
真题演练1
# Define an index alias for "accounts-row" called "accounts-male": Apply a filter to only show the male account owners# 为"accounts-row"定义一个索引别名,称为"accounts-male":应用一个过滤器,只显示男性账户所有者POST _aliases{ "actions": [ { "add": { "index": "accounts-row", "alias": "accounts-male", "filter": { "bool": { "filter": [ { "term": { "gender.keyword": "male" } } ] } } } } ]}
十三.Search-template
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-template.html
功能特点
模板接受在运行时指定参数。搜索模板存储在服务器端,可以在不更改客户端代码的情况下进行修改。
初识search-template
# 创建检索模板PUT _scripts/my-search-template{ "script": { "lang": "mustache", "source": { "query": { "match": { "{{query_key}}": "{{query_value}}" } }, "from": "{{from}}", "size": "{{size}}" } }}# 使用检索模板查询GET my-index/_search/template{ "id": "my-search-template", "params": { "query_key": "your filed", "query_value": "your filed value", "from": 0, "size": 10 }}
索引模板的操作
创建索引模板
PUT _scripts/my-search-template{ "script": { "lang": "mustache", "source": { "query": { "match": { "message": "{{query_string}}" } }, "from": "{{from}}", "size": "{{size}}" }, "params": { "query_string": "My query string" } }}
验证索引模板
POST _render/template{ "id": "my-search-template", "params": { "query_string": "hello world", "from": 20, "size": 10 }}
执行检索模板
GET my-index/_search/template{ "id": "my-search-template", "params": { "query_string": "hello world", "from": 0, "size": 10 }}
获取全部检索模板
GET _cluster/state/metadata?pretty&filter_path=metadata.stored_scripts
删除检索模板
DELETE _scripts/my-search-templateath=metadata.stored_scripts
十四.Search-dsl 简单检索
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/query-dsl.html
检索选型
检索分类
自定义评分
如何自定义评分
1.index Boost索引层面修改相关性
// 一批数据里,有不同的标签,数据结构一致,不同的标签存储到不同的索引(A、B、C),最后要严格按照标签来分类展示的话,用什么查询比较好?// 要求:先展示A类,然后B类,然后C类# 测试数据如下put /index_a_123/_doc/1{ "title":"this is index_a..."}put /index_b_123/_doc/1{ "title":"this is index_b..."}put /index_c_123/_doc/1{ "title":"this is index_c..."}# 普通不指定的查询方式,该查询方式下,返回的三条结果数据评分是相同的POST index_*_123/_search{ "query": { "bool": { "must": [ { "match": { "title": "this" } } ] } }}官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-search.htmlindices_boost# 也就是索引层面提升权重POST index_*_123/_search{ "indices_boost": [ { "index_a_123": 10 }, { "index_b_123": 5 }, { "index_c_123": 1 } ], "query": { "bool": { "must": [ { "match": { "title": "this" } } ] } }}
2.boosting 修改文档相关性
某索引index_a有多个字段, 要求实现如下的查询:1)针对字段title,满足"ssas"或者"sasa’。2)针对字段tags(数组字段),如果tags字段包含"pingpang",则提升评分。要求:写出实现的DSL?# 测试数据如下put index_a/_bulk{"index":{"_id":1}}{"title":"ssas","tags":"basketball"}{"index":{"_id":2}}{"title":"sasa","tags":"pingpang; football"}# 解法1POST index_a/_search{ "query": { "bool": { "must": [ { "bool": { "should": [ { "match": { "title": "ssas" } }, { "match": { "title": "sasa" } } ] } } ], "should": [ { "match": { "tags": { "query": "pingpang", "boost": 1 } } } ] } }}# 解法2// https://www.elastic.co/guide/en/elasticsearch/reference/8.1/query-dsl-function-score-query.htmlPOST index_a/_search{ "query": { "bool": { "should": [ { "function_score": { "query": { "match": { "tags": { "query": "pingpang" } } }, "boost": 1 } } ], "must": [ { "bool": { "should": [ { "match": { "title": "ssas" } }, { "match": { "title": "sasa" } } ] } } ] } }}
3.negative_boost降低相关性
对于某些结果不满意,但又不想通过 must_not 排除掉,可以考虑可以考虑boosting query的negative_boost。即:降低评分negative_boost(Required, float) Floating point number between 0 and 1.0 used to decrease the relevance scores of documents matching the negative query.官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/query-dsl-boosting-query.htmlPOST index_a/_search{ "query": { "boosting": { "positive": { "term": { "tags": "football" } }, "negative": { "term": { "tags": "pingpang" } }, "negative_boost": 0.5 } }}
4.function_score 自定义评分
如何同时根据 销量和浏览人数进行相关度提升?问题描述:针对商品,例如有想要有一个提升相关度的计算,同时针对销量和浏览人数?例如oldScore*(销量+浏览人数)************************** 商品 销量 浏览人数 A 10 10 B 20 20C 30 30************************** # 示例数据如下 put goods_index/_bulk{"index":{"_id":1}}{"name":"A","sales_count":10,"view_count":10}{"index":{"_id":2}}{"name":"B","sales_count":20,"view_count":20}{"index":{"_id":3}}{"name":"C","sales_count":30,"view_count":30}官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/query-dsl-function-score-query.html知识点:script_scorePOST goods_index/_search{ "query": { "function_score": { "query": { "match_all": {} }, "script_score": { "script": { "source": "_score * (doc["sales_count"].value+doc["view_count"].value)" } } } }}
十五.Search-del Bool复杂检索
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/query-dsl-bool-query.html
基本语法
真题演练
写一个查询,要求某个关键字再文档的四个字段中至少包含两个以上功能点:bool 查询,should / minimum_should_match 1.检索的bool查询 2.细节点 minimum_should_match注意:minimum_should_match 当有其他子句的时候,默认值为0,当没有其他子句的时候默认值为1POST test_index/_search{ "query": { "bool": { "should": [ { "match": { "filed1": "kr" } }, { "match": { "filed2": "kr" } }, { "match": { "filed3": "kr" } }, { "match": { "filed4": "kr" } } ], "minimum_should_match": 2 } }}
十六.Search-Aggregations
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-aggregations.html
聚合分类
分桶聚合(bucket)
terms
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-aggregations-bucket-terms-aggregation.html# 按照作者统计文档数POST bilili_elasticsearch/_search{ "size": 0, "aggs": { "agg_user": { "terms": { "field": "user", "size": 1 } } }}
date_histogram
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-aggregations-bucket-datehistogram-aggregation.html# 按照up_time 按月进行统计POST bilili_elasticsearch/_search{ "size": 0, "aggs": { "agg_up_time": { "date_histogram": { "field": "up_time", "calendar_interval": "month" } } }}
指标聚合 (metrics)
Max
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-aggregations-metrics-max-aggregation.html# 获取up_time最大的POST bilili_elasticsearch/_search{ "size": 0, "aggs": { "agg_max_up_time": { "max": { "field": "up_time" } } }}
Top_hits
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-aggregations-metrics-top-hits-aggregation.html# 根据user聚合只取一个聚合结果,并且获取命中数据的详情前3条,并按照指定字段排序POST bilili_elasticsearch/_search{ "size": 0, "aggs": { "terms_agg_user": { "terms": { "field": "user", "size": 1 }, "aggs": { "top_user_hits": { "top_hits": { "_source": { "includes": [ "video_time", "title", "see", "user", "up_time" ] }, "sort": [ { "see":{ "order": "desc" } } ], "size": 3 } } } } }}// 返回结果如下{ "took" : 91, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1000, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "terms_agg_user" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 975, "buckets" : [ { "key" : "Elastic搜索", "doc_count" : 25, "top_user_hits" : { "hits" : { "total" : { "value" : 25, "relation" : "eq" }, "max_score" : null, "hits" : [ { "_index" : "bilili_elasticsearch", "_id" : "5ccCVoQBUyqsIDX6wIcm", "_score" : null, "_source" : { "video_time" : "03:45", "see" : "92", "up_time" : "2021-03-19", "title" : "Elastic 社区大会2021: 用加 Gatling 进行Elasticsearch的负载测试,寓教于乐。", "user" : "Elastic搜索" }, "sort" : [ "92" ] }, { "_index" : "bilili_elasticsearch", "_id" : "8scCVoQBUyqsIDX6wIgn", "_score" : null, "_source" : { "video_time" : "10:18", "see" : "79", "up_time" : "2020-10-20", "title" : "为Elasticsearch启动htpps访问", "user" : "Elastic搜索" }, "sort" : [ "79" ] }, { "_index" : "bilili_elasticsearch", "_id" : "7scCVoQBUyqsIDX6wIcm", "_score" : null, "_source" : { "video_time" : "04:41", "see" : "71", "up_time" : "2021-03-19", "title" : "Elastic 社区大会2021: Elasticsearch作为一个地理空间的数据库", "user" : "Elastic搜索" }, "sort" : [ "71" ] } ] } } } ] } }}
子聚合 (Pipeline)
Pipeline:基于聚合的聚合 官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-aggregations-pipeline.html
bucket_selector
官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-aggregations-pipeline-bucket-selector-aggregation.html
# 根据order_date按月分组,并且求销售总额大于1000POST kibana_sample_data_ecommerce/_search{ "size": 0, "aggs": { "date_his_aggs": { "date_histogram": { "field": "order_date", "calendar_interval": "month" }, "aggs": { "sum_aggs": { "sum": { "field": "total_unique_products" } }, "sales_bucket_filter": { "bucket_selector": { "buckets_path": { "totalSales": "sum_aggs" }, "script": "params.totalSales > 1000" } } } } }}
真题演练
earthquakes索引中包含了过去30个月的地震信息,请通过一句查询,获取以下信息l 过去30个月,每个月的平均 magl 过去30个月里,平均mag最高的一个月及其平均magl 搜索不能返回任何文档 max_bucket 官网地址:https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-aggregations-pipeline-max-bucket-aggregation.htmlPOST earthquakes/_search{ "size": 0, "query": { "range": { "time": { "gte": "now-30M/d", "lte": "now" } } }, "aggs": { "agg_time_his": { "date_histogram": { "field": "time", "calendar_interval": "month" }, "aggs": { "avg_aggs": { "avg": { "field": "mag" } } } }, "max_mag_sales": { "max_bucket": { "buckets_path": "agg_time_his>avg_aggs" } } }}
-
环球快报:火山引擎 DataLeap 通过中国信通院测评,数据管理能力获官方认可!
近日,火山引擎大数据研发治理套件DataLeap通过中国信通院第十五批“可信大数据”测评,在数据管理平台...
来源: ElasticSearch必知必会-基础篇
环球快报:火山引擎 DataLeap 通过中国信通院测评,数据管理能力获官方认可!
全球速递!开源动物行为分析实验箱(斯金纳箱)需求调研分析
世界看点:低代码开发:释放数字化生产力
文件IO操作开发笔记(二):使用Cpp的ofstream对磁盘文件存储进行性能测试以及测试工具
百事通!成了!微信:视频号用户总使用时长接近朋友圈80%
天天要闻:开袋即食 一口弹牙 大牌优形肉肠0.99元/根(商超2.5元)
快资讯:期待!《生化危机4:重制版》威斯克或将登场
特斯拉门店:降价维权后销量翻倍!全国一天提车量超1万台
2023支付宝集五福最全攻略 神秘玩法千万别错过
琥珀银杏果是什么东西?琥珀银杏果是什么地方的菜?
兵长一米六是什么意思?兵长一米六顺口溜
美髯公指的是谁?美髯公是什么意思?
金坷垃是什么意思?金坷垃是什么时候的梗?
肥皂水是碱性还是酸性?肥皂水的主要化学成分是什么?
主角叫萧破天的小说有哪些?主角叫萧破天的全部小说
转世仁波切是什么意思?转世仁波切怎么认证?
电信拨打长途前面加什么?电信拨打长途要钱吗?
今日最新!金子塔图,自定义图表,伪漏斗图
环球今日报丨Codeforces 1704 F Colouring Game 题解 (结论,SG函数)
dnf武极觉醒技能怎么点?DNF武极觉醒技能介绍
倒角外倒角内倒角怎么区分?倒角外倒角内倒角的区别有哪些?
申怡走进云南白沙湾小学开讲公益语文课 用语文点亮希望的灯火
【新视野】专心打造小米汽车!雷军已卸任多家小米旗下公司职务
天天新资讯:《中国奇谭》爆火出圈!淘宝周边已卖断货 网友建议快出小野猪毛刷
世界速看:特斯拉二把手上位之路:朱晓彤如何打动马斯克?
环球资讯:比特斯拉多卖40万辆 比亚迪提前锁定2022年全球新能源销冠
【环球热闻】日志瘦身骚操作:从 5G 优化到 1G。
重磅发布丨从云原生到 Serverless,先行一步看见更大的技术想象力
世界简讯:rsync使用技巧
最新快讯!美国要给飞机安装5G信号屏蔽仪:避免影响航空安全
足坛再无“大圣” 33岁老将贝尔宣布退役
世界报道:2023年世界航天首次失利!英国维珍轨道火箭异常:9颗卫星没了
极狐考拉发布首款智能亲子车:有侧滑门、自带电子安全座椅
你集齐五福了吗?扫这张图能拿额外福卡 每天都有
【全球新要闻】劳斯莱斯2022年销量刷百年纪录!土豪都喜欢定制车
【天天聚看点】1.47英寸大屏、14天续航!Redmi手环2年货节优惠:仅159元
当前热门:腾讯股价翻倍 港股又香了 2023年首只爆款基金20亿一天卖完
全球观热点:联合国:地球臭氧层有望在40年内恢复 已步入正轨
环球即时看!国外小伙买世界最亮手电筒 网友:天已亮 该去上班了
天天微动态丨清华教授:互联网公司很难形成垄断了
支付宝“集五福”正式开启:已有2.7万人火速集齐 分5亿红包
天天微速讯:最新安卓手机用户偏好榜:12G内存、512G存储逐渐成主流
每日热文:洛谷P3956. [NOIP2017. PJ]棋盘
Spring IOC官方文档学习笔记(八)之容器扩展点
HTML超文本标记语言4
【环球快播报】茅台董事长丁雄军:买不到茅台还吃不起冰激凌吗?
小米12S Ultra官网缺货!卢伟冰推荐小米13 Pro:影像也非常强
环球快讯:过去10年 全国130多个县第一次通上铁路
环球热门:2.5亿年前 96%的物种突然消失!中国学者有了重大发现
精彩看点:还在用20世纪90年代的破系统!美国航空巨头8天赔掉50个亿
ThreadLocal底层原理
焦点热文:小米13 Pro把单反相机技术塞入手机里!雷军:效果惊艳
AMD三颗新U齐发!锐龙9 7900、锐龙7 7700、锐龙5 7600图赏
暴雪国服代理谈判被曝进入"二选一"阶段:手游版权开发分成是核心
报道:SpaceX猎鹰重型火箭再次发射美军卫星:能抗核打击
环球今热点:在QEMU-KVM环境下部署Oracle 19.16 RAC
全球要闻:HTML超文本标记语言3
苹果中国官网上线智能家居板块:一个LED灯泡卖168元 贵吗?
世界实时:《三体》电视剧过审上微博热搜 网友:只求别魔改!
环球今日报丨去意已决?巴菲特再度减持比亚迪
全球快消息!真爱粉!苏州加油为抢一加11首发跑到上海:对新品非常期待
世界观速讯丨C++引用【cherno课程学习】
【天天报资讯】「年终总结」写了 3 年文章的我,昨天第一次露脸直播。
环球今日报丨【前端调试】- 利用 Performance 和 Memory 分析内存
热点!操作系统 — 精髓与设计原理(第一章 计算机系统概述)
世界播报:学习笔记——Mybatis映射文件根标签与子标签
全球即时看!又一豪华巨头败走中国 官网关停!长安终于可以独享车标了
环球新消息丨广告又来?Win11将在文件管理器显示“推荐内容”
AMD锐龙7000新U不讲武德:编号更高 频率反而更低
车企"英文+数字"的新车命名规则被吐槽无趣 不如中文
外星人M18首发!京东方推出18英寸480Hz笔记本屏
全球热议:java不同版本jdk切换
每日焦点!读博初始心境-求讨论
前沿热点:抖音2023年春节红包来了:分4亿 最高可得万元奖金
环球快看点丨彻底终结充电焦虑?韩国SK On新技术:汽车电池18分钟充满
世界微资讯!电竞手机要消亡!卢伟冰:有了Redmi K60就不需要电竞手机
国内演员指责电视收费乱象:大几千买的电视看不了 打开全要收费
NAT类型检测方案
世界热议:学习笔记——Mybatis核心配置文件概述及根标签
VisualStudio 使用 FastTunnel 辅助搭建远程调试环境
世界观焦点:“外星科技”加持!Redmi 12C支持双SIM卡+TF卡拓展:699元起
搜狐张朝阳谈工作意义:年轻人赚钱享乐的想法不对
同步小米13 Ultra!小米平板6/6 Pro来了:处理器、屏幕大升级
今晚20点整:京东年货红包重磅加码 最高9999元
360Hz超高刷也白菜价了 泰坦军团1ms电竞显示器到手1629元
火山引擎 DataTester:5 个优化思路,构建高性能 A/B 实验平台
环球新资讯:对话阿里云叔同:如何看待 2022 年云原生的发展,2023 年有哪些值得关注的技术?
全球新动态:字符串匹配算法综述
新资讯:网易云音乐用户画像资产治理及业务赋能
每日热议![概率论与数理统计]笔记:3.1 随机向量的分布
环球短讯!俄罗斯开发者1年拿不到钱!好好的微星AfterBurner被一场战争害死
盘点CES上让人耳目一新的小玩意:极具创意
参与美国“阿尔忒弥斯计划” 日本人将首次登陆月球:日期未定
2499元起 Redmi K60成了:京东好评率比iPhone 14更高
新动态:你能接受不?奔驰Smart精灵#1开启硬件订阅:座椅加热1299元
环球播报:软件开发入门教程网之C++ 引用
[笔记]斜率优化
HTML超文本标记语言2
时讯:股价暴跌后!特斯拉最大华裔散户天天“炮轰”马斯克