当前位置: 首页 > article >正文

使用 Bodybuilder 项目简化前端ES查询


bodybuild 分为4个部分

  • aggregation-builder
  • filter-builder
  • query-builder
  • suggestion-builder

index


通过 build 函数即可生成我们常用的es查询DSL

 build: function build(version) {
      var queries = this.getQuery();  
      var filters = this.getFilter();
      var aggregations = this.getAggregations();
      var suggestions = this.getSuggestions();

      if (version === 'v1') return _buildV1(body, queries, filters, aggregations);

      return _build(body, queries, filters, aggregations, suggestions);
}

从上述代码可以看出, bodybuild 通过获取其四大件即可 build 出一个关于ES查询的DSL脚本

入口文件还提供了以下函数

  • sort 在给定字段上设置排序方向。
  • from 设置from偏移量值,用于对查询进行分页。
  • size 设置size值以返回最大结果。
  • rawOption 在 elasticsearch 主体上设置任意键值。
  • clone 返回bodybuilder的克隆实例
 bodybuilder()
	 .andFilter('term', 'user', 'kimchy')
	 .from(2)
	 .size(3)
	 .sort('timestamp', 'desc')
{
    "from": 2,
    "size": 3,
    "sort": [
        {
            "timestamp": {
                "order": "desc"
            }
        }
    ],
    "query": {
        "bool": {
            "filter": {
                "term": {
                    "user": "kimchy"
                }
            }
        }
    }
}

query


/**
 * Add a query clause to the query body.
 *
 * @param  {string}        type    查询类型。
 * @param  {string|Object} field   字段来查询或完成查询子句。
 * @param  {string|Object} value   查询项或内部子句
 * @param  {Object}        options (可选)查询子句的附加选项。
 * @param  {Function}      [nest]  (可选)用于将子过滤器定义为子过滤器的函数。这必须是最后一个参数。
 *
 * @return {bodybuilder} Builder.
 */
  • type 第一个参数为请求类型
  • field 需要查询的字段
  • value 匹配的值
bodybuilder().query('**match_all**').build()
{
    "query": {
        "**match_all**": {
        
        }
    }
}
bodybuilder().query('**match_all**', { boost: 1.2 }).build())
{
    "query": {
        "**match_all**": {
            "boost": 1.2
        }
    }
}
bodybuilder().query('**match**', 'message', 'this is a test').build())
{
    "query": {
        "**match**": {
            "message": "this is a test"
        }
    }
}
bodybuilder().query('**terms**', 'user', ['kimchy', 'elastic']).build())
{
    "query": {
        "**terms**": {
            "user": [
                "kimchy",
                "elastic"
            ]
        }
    }
}

上述三个查询 type 、field、value 结合即可完成简单的搜索查询

options 和 nest

 bodybuilder()
 .query(
		 'nested', 
		 { path: 'obj1', score_mode: 'avg' }, 
     (q) => {
		     return q.query('match', 'obj1.name', 'blue')
									.query('range', 'obj1.count', { gt: 5 })
     })
 .build()   
      
// # ES DSL
{
    "query": {
        "nested": {
            "path": "obj1",
            "score_mode": "avg",
            "query": {
                "bool": {
                    "must": [
                        {
                            "match": {
                                "obj1.name": "blue"
                            }
                        },
                        {
                            "range": {
                                "obj1.count": {
                                    "gt": 5
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}

aggregation


/**
 * 向查询主体添加聚合子句。
 *
 * @param  {string|Object} type      聚合类型的名称,如“sum”或“terms”。
 * @param  {string}        field     要聚合的字段的名称。
 * @param  {Object}        [options] (可选)要包含在聚合中的其他选项。
 *                         [options._meta] 将元数据与单个聚合关联起来
 *                         [options._name ] 另一种将自定义名称传递给聚合的方法。
 * @param  {string}        [name]    (可选) 聚合的自定义名称,默认为 `agg_<type>_<field>`.
 * @param  {Function}      [nest]    (可选) 用于将子聚合定义为子聚合的函数。这必须是最后一个参数。
 *
 * @return {bodybuilder} Builder.
 *
 */

这种格式为聚合语句

下面case为type 和 filed的使用

bodybuilder().aggregation('max', 'price').build()
{
	"aggs":{
		"agg_max_price":{
			"max":{
				"field":"price"
			}
		}
	}
}

要包含在聚合中的其他选项。

 bodybuilder()
    .aggregation('max', 'price', { percents: [95, 99

http://www.kler.cn/a/287698.html

相关文章:

  • torch.stack 张量维度的变化
  • 系统思考—结构影响行为
  • 腾讯云内容合规基于springboot架构设计
  • 基础IO2
  • 基于视觉智能的时间序列基础模型
  • MySQL的游标和While循环的详细对比
  • 某系统存在任意文件下载漏洞
  • Springboot使用Mongo数据库实现文件的上传下载预览等服务接口
  • pbds库
  • App使用Job定时器不准时的原因分析
  • Java项目中的分库分表实践指南
  • 前端学习Day36
  • 【设计模式之原型模式——矩形原型】
  • Spring 事务 数据库连接获取和释放原理
  • 网络安全的历史
  • 基于my Batis优化图书管理系统(总)
  • 通用后台管理系统实战演示(Vue3 + element-plus)汇总篇二
  • 设计模式之生成器方法
  • css揭秘 7 结构与布局
  • Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
  • 使用API有效率地管理Dynadot域名,添加账户中的联系人信息
  • Java中Object的常用方法
  • 专利复现_基于ngboost和SHAP值可解释预测方法
  • 【html】新建一个html并且在浏览器运行
  • 零域(微隔离)详述
  • docker4