當我搜索彈性搜索聚合時,我只找到multi_terms用于按多個欄位分組的。但我正在尋找如何按一個具有多個值的欄位進行分組。
我有一個欄位product,其值可以是fruit, electronic,veg等furniture。我喜歡按所有檔案分組,其值為要么fruit要么veg。我怎樣才能做到這一點?
我正在尋找一種不更新索引映射的方法。由于product經常更改的值,我需要在運行時支持組欄位的任意組合。
uj5u.com熱心網友回復:
您可以將腳本與術語聚合一起使用。
我使用了runtime_mapping這是一個腳本,它會為產品蔬菜和水果發出單個值,您可以使用它來對資料進行分組。
您還可以索引運行時欄位以提高性能。
{
"runtime_mappings": {
"product_custom": {
"type": "keyword",
"script": {
"source": """
if(doc["product.keyword"].value=="vegetable"
|| doc["product.keyword"].value=="fruit")
{
emit("vegetable/fruit");
}
else
{
emit(doc["product.keyword"].value);
}
"""
}
}
},
"aggs": {
"product_custom": {
"terms": {
"field": "product_custom"
}
}
}
}
結果
"aggregations" : {
"product_custom" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "vegetable/fruit",
"doc_count" : 3
},
{
"key" : "electronic",
"doc_count" : 1
}
]
}
}
更新
運行時欄位從 7.11 版開始可用
您還可以在聚合方面使用腳本來實作相同的目的
{
"aggs": {
"product_custom": {
"terms": {
"script": {
"source": """
if(doc["product.keyword"].value=="vegetable"
|| doc["product.keyword"].value=="fruit")
{
return "vegetable/fruit";
}
else
{
return doc["product.keyword"].value;
}
"""
}
}
}
}
}
腳本和運行/時映射很慢,因為一切都是在搜索時完成的。您可以將運行時欄位添加到索引中,而無需重新創建索引。它會比腳本提供更好的性能
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/523559.html
標籤:弹性搜索
上一篇:ElasticSearch:可以使用正則運算式欄位進行查詢嗎?
下一篇:彈性云上的節點與分片
