自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Elasticsearch中使用Runtime Fields

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

1、背景

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

2、runtime field介紹

2.1 runtime field可以實現(xiàn)的功能

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

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

2.2 runtime field優(yōu)缺點

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

3、創(chuàng)建runtime field的方式

3.1 通過mapping的方式創(chuàng)建

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類型,現(xiàn)在我們需要根據(jù)這個字段來進行聚合操作,那么使用runtime field該如何操作呢?

5、實現(xiàn)

5.1 mapping

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

注意此時的lineName的類型是text

5.2 插入數(shù)據(jù)

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、根據(jù)線路來進行聚合

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

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)
// 查詢所有數(shù)據(jù)
.query(query -> query.matchAll(matchAll -> matchAll))
// runtime field字段不會出現(xiàn)在 _source中,需要使用使用 fields api來獲取
.fields(fields -> fields.field("lineName"))
// 創(chuàng)建一個 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日志

2020-09-07 11:30:47

ElasticSear索引Linux

2021-11-02 13:54:41

ElasticSear.NET程序

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

2009-06-25 16:49:24

Hibernate

2023-11-17 12:04:39

GORM并發(fā)

2013-12-13 17:21:14

Lua腳本語言

2023-04-12 15:25:09

Bytrace鴻蒙

2017-06-07 15:51:50

AndroidAndroid Stuapt

2024-06-26 19:14:53

2023-12-29 08:33:17

2013-01-07 13:54:17

Android開發(fā)JUnit單元測試

2011-07-08 13:28:10

XCode SVN

2013-01-14 12:53:13

Firefox OSIndexedDB
點贊
收藏

51CTO技術棧公眾號