成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Elasticsearch中使用Runtime Fields

開發 前端
在我們使用es的開發過程中可能會遇到這么一種情況,比如我們的線路名稱字段lineName字段在設置mapping的時候使用的是text類型,但是后期發現需要使用這個字段來進行聚合操作,那么我們除了對索引進行reindex操作外,還有什么辦法可以解決這個問題呢?

1、背景

在我們使用es的開發過程中可能會遇到這么一種情況,比如我們的線路名稱字段lineName字段在設置mapping的時候使用的是text類型,但是后期發現需要使用這個字段來進行聚合操作,那么我們除了對索引進行reindex操作外,還有什么辦法可以解決這個問題呢?此處我們通過runtime field來解決。

2、runtime field介紹

2.1 runtime field可以實現的功能

運行時字段是在查詢時評估的字段。是在es7.11之后增加的運行時字段使您能夠:

  1. 將字段添加到現有文檔,而無需重新索引數據
  2. 在不了解數據結構的情況下開始處理數據
  3. 在查詢時覆蓋從索引字段返回的值
  4. 定義特定用途的字段,而不修改原始mappingruntime field 的作用

2.2 runtime field優缺點

  1. runtime field是運行時增加的字段,不會被索引和存儲,不會增加索引的大小。
  2. runtime field 可以像普通字段一樣使用,可以進行查詢,排序,聚合等操作。
  3. 可以動態的添加字段。
  4. 可以在查詢時覆蓋字段的值。即fields中和_source中可以返回同名的字段,但是值可能不一樣。
  5. 阻止mapping爆炸,可以先使用后定義。
  6. 針對經常被搜索或聚合等操作的字段,不適合使用runtime field,而應該定義在mapping中。
  7. runtime field不會出現在_source中,需要通過fields api來獲取。

3、創建runtime field的方式

3.1 通過mapping的方式創建

3.1.1、添加runtime field

PUT /index_script_fields
{
"mappings": {
"runtime": {
"aggLineName": {
"type": "keyword",
"script": {
"source": "emit(doc['lineName'].value)"
}
}
},
"properties": {
"lineId": {
"type": "keyword"
},
"lineName": {
"type": "text"
}
}
}
}

3.1.2、更新 runtime field

POST /index_script_fields/_mapping
{
"runtime": {
"aggLineName": {
"type": "keyword",
"script": {
"source": "emit(doc['lineName'].value)"
}
}
}
}

3.1.3、刪除runtime field

POST /index_script_fields/_mapping
{
"runtime": {
"aggLineName": null
}
}

3.2 通過search request定義runtime field

GET /index_script_fields/_search
{
"runtime_mappings": {
"lineName": {
"type": "keyword",
"script": "emit(params['_source']['lineName']+'new')"
}
},
"query": {
"match_all": {}
},
"fields": [
"lineName"
]
}

通過search request定義runtime field

4、需求

我們存在一個線路mapping,其中lineName在設計的使用使用了text類型,現在我們需要根據這個字段來進行聚合操作,那么使用runtime field該如何操作呢?

5、實現

5.1 mapping

PUT /index_script_fields
{
"mappings": {
"properties": {
"lineId": {
"type": "keyword"
},
"lineName": {
"type": "text"
}
}
}
}

注意此時的lineName的類型是text

5.2 插入數據

PUT /index_script_fields/_bulk
{"index":{"_id":1}}
{"lineId":"line-01","lineName":"線路A"}
{"index":{"_id":2}}
{"lineId":"line-01","lineName":"線路A"}
{"index":{"_id":3}}
{"lineId":"line-02","lineName":"線路C"}

5.3、根據線路來進行聚合

從上方的mapping中可以lineNametext類型,是不可進行聚合操作的,那么此時我們想進行聚合操作,就可以使用runtime field來實現。

5.3.1 不使用runtime field

不使用runtime field

5.3.2 使用runtime field

5.3.2.1 dsl

GET /index_script_fields/_search
{
"runtime_mappings": {
"aggLineName": {
"type": "keyword",
"script": "emit(params['_source']['lineName']+'new')"
}
},
"query": {
"match_all": {}
},
"fields": [
"lineName"
],
"aggs": {
"agg_line_name": {
"terms": {
"field": "aggLineName",
"size": 10
}
}
}
}

5.3.2.2 java代碼

@Test
@DisplayName("lineName字段是text類型,無法進行聚合操作,定義一個runtime field來進行聚合操作")
public void test01() throws IOException {
SearchRequest request = SearchRequest.of(searchRequest ->
searchRequest.index(INDEX_NAME)
// 查詢所有數據
.query(query -> query.matchAll(matchAll -> matchAll))
// runtime field字段不會出現在 _source中,需要使用使用 fields api來獲取
.fields(fields -> fields.field("lineName"))
// 創建一個 runtime filed 字段類型是 keyword
.runtimeMappings("aggLineName", runtime ->
runtime
// 此處給字段類型為keyword
.type(RuntimeFieldType.Keyword)
.script(script ->
script.inline(inline ->
// runtime field中如果使用 painless腳本語言,需要使用emit
inline.lang(ScriptLanguage.Painless)
.source("emit(params['_source']['lineName']+'new')")
)
)
)
// 進行聚合操作
.aggregations("agg_line_name", agg ->
// 此處的 aggLineName即為上一步runtime field的字段
agg.terms(terms -> terms.field("aggLineName").size(10))
)
.size(100)
);

System.out.println("request: " + request);
SearchResponse<Object> response = client.search(request, Object.class);
System.out.println("response: " + response);

5.3.3.3 運行結果

聚合

6、完整代碼

https://gitee.com/huan1993/spring-cloud-parent/blob/master/es/es8-api/src/main/java/com/huan/es8/runtimefield/RuntimeFieldCorrectMappingError.java

7、參考鏈接

1、https://www.elastic.co/guide/en/elasticsearch/reference/8.6/runtime.html?

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2021-06-09 09:36:18

DjangoElasticSearLinux

2021-08-10 07:27:42

ASP.NETFluentd日志

2021-11-02 13:54:41

ElasticSear.NET程序

2020-09-07 11:30:47

ElasticSear索引Linux

2021-03-18 15:10:42

ElasticSearBeta日志

2009-06-30 16:52:30

DetchedCrit

2023-08-25 09:17:38

2024-08-01 10:10:24

MySQL場景搜索

2024-02-29 08:02:00

2021-05-11 09:02:34

OpenSearch存儲Elastcsearc

2013-12-13 17:21:14

Lua腳本語言

2023-11-17 12:04:39

GORM并發

2017-06-07 15:51:50

AndroidAndroid Stuapt

2023-04-12 15:25:09

Bytrace鴻蒙

2009-06-25 16:49:24

Hibernate

2013-01-07 13:54:17

Android開發JUnit單元測試

2011-07-08 13:28:10

XCode SVN

2013-01-14 12:53:13

Firefox OSIndexedDB

2024-06-26 19:14:53

2023-12-29 08:33:17

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠av| 久久精品一级 | 亚洲成人精品一区二区 | 欧美视频在线看 | 国产美女视频一区 | 精品欧美激情在线观看 | 欧美女优在线观看 | 久久成人精品视频 | 国产韩国精品一区二区三区 | 国产一区二区在线视频 | 久久精品国产一区二区电影 | 色婷婷综合久久久中字幕精品久久 | 美女拍拍拍网站 | 久久尤物免费一区二区三区 | 亚洲精品一区二区三区蜜桃久 | 国产av毛片 | 日韩欧美在线观看视频网站 | 久久久精彩视频 | 一区精品视频 | 久久久久国产精品 | 黑色丝袜三级在线播放 | 亚洲男人网 | 亚洲精品国产综合区久久久久久久 | 欧美日韩亚洲成人 | 国产精品中文字幕在线 | 日韩精品在线一区 | 日韩在线免费播放 | 欧美国产日韩在线 | 亚洲黄色av | 午夜爽爽爽男女免费观看影院 | 欧美一级在线免费 | 在线视频中文字幕 | 北条麻妃99精品青青久久主播 | a级网站 | 国产www在线 | 日韩av第一页 | 国产精品日韩一区 | 羞羞视频在线网站观看 | 干干干操操操 | 美女亚洲一区 | 国产欧美一区二区精品忘忧草 |