多次查找、聚合转储、折叠查询?

问题描述 投票:0回答:1

假设我有一个索引,其中我的文档是汽车。

每辆车有以下一些属性:品牌、型号、颜色、生产年份、发动机类型、长度、座位数等

我有给定品牌的型号列表。 我想检索有关每个模型的通用信息,因此我只需要为每个模型提取一个文档。

示例:车型为凯美瑞。我想知道这是一辆轿车,5 个座位,15 英尺长等。我不关心每辆凯美瑞的颜色、年份等。

这是我想做的事情:

  • 多重搜索:运行多次查找,但仍然不可扩展
  • 将所有查询与 Make 上的过滤器相匹配并在模型上折叠:与分页搜索不兼容,我的索引太大
  • 聚合模型,子聚合我正在寻找的字段,按制造商过滤。计算量是否太大?

还有其他我没有想到的选择,或者解决我遇到的问题的方法吗?

elasticsearch opensearch
1个回答
0
投票
Elastic 的新

ES|QL 查询语言 可以帮助解决这个问题,因为它具有搜索时连接功能(又名 [ENRICH][https://www.elastic.co/guide/en/elasticsearch/reference/current/ esql-enrich-data.html]).

假设您的

cars

models
 索引如下所示:

PUT cars { "mappings": { "properties": { "make": { "type": "keyword" }, "model": { "type": "keyword" }, "color": { "type": "keyword" } } } } PUT models { "mappings": { "properties": { "model": { "type": "keyword" }, "type": { "type": "keyword" } } } }
我们可以在每个索引中添加示例文档

POST cars/_bulk {"index": {}} {"make": "toyota", "model": "camry", "color": "red" } POST models/_bulk {"index": {}} {"model":"camry", "type": "sedan"}
然后,您需要做的就是创建一个丰富策略,允许您加入 

model

 字段,如下

PUT /_enrich/policy/models_policy { "match": { "indices": "models", "match_field": "model", "enrich_fields": ["type"] } } PUT /_enrich/policy/models_policy/_execute?wait_for_completion=false
丰富政策运行后(如果您的 

models

 索引很大,可能需要一些时间,您将有一个可以加入的支持索引。

ES|QL 查询将如下所示:

POST _query?format=csv { "query": """ FROM cars | WHERE make == "toyota" | ENRICH model-policy ON model WITH type """ }
您将得到的结果将如下所示,即您已经能够将模型的类型 (

sedan

) 加入到您的结果中:

color,make,model,type red,toyota,camry,sedan
    
© www.soinside.com 2019 - 2024. All rights reserved.