专栏首页xingoo, 一个梦想做发明家的程序员Elasticsearch Javascript API增删改查

Elasticsearch Javascript API增删改查

查询

根据索引、类型、id进行查询:

client.get({ 
     index:'myindex', 
     type:'mytype', 
     id:1 
},function(error, response){// ...});

根据某个查询条件,查询某个索引的所有数据

client.search({ 
     index:'myindex', 
     q:'title:test' 
},function(error, response){// ...});

复杂一点的查询:

client.search({ 
     index:'myindex', 
     body:{ 
         query:{ 
             match:{ 
                 title:'test' 
                } 
            }, 
         facets:{ 
             tags:{ 
                 terms:{ 
                     field:'tags' 
                    } 
                } 
            } 
        } 
},function(error, response){// ...});

新增

新增时,需要指定索引,类型,和id,还有保存的内容:

client.create({ 
     index:'myindex', 
     type:'mytype', 
     id:'1', 
     body:{ 
         title:'Test 1', 
         tags:['y','z'], 
         published:true, 
         published_at:'2013-01-01', counter:1 
    } 
},function(error, response){// ...});

删除

按照索引,类型和id删除:

client.delete({ 
     index:'myindex', 
     type:'mytype', 
     id:'1' 
},function(error, response){// ...});

修改

修改操作通常使用update方法:

client.update({ 
     index:'myindex', 
     type:'mytype', 
     id:'1', 
     body:{ 
        // put the partial document under the `doc` key 
         doc:{ 
             title:'Updated' 
            } 
     } 
},function(error, response){// ...})

一次性执行多个操作

ESClient也支持一次性执行多个操作:

client.mget({ 
     body:{ 
         docs:[ { 
            _index:'indexA', _type:'typeA', _id:'1' 
        },{
            _index:'indexB', _type:'typeB', _id:'1' 
        },{ 
            _index:'indexC', _type:'typeC', _id:'1' 
        }] 
    } 
},function(error, response){// ...});

也支持下面的风格:

client.mget({ 
     index:'myindex', 
     type:'mytype', 
     body:{ ids:[1,2,3]} 
},function(error, response){// ...});

类似的也可以同时执行多个查询:

client.msearch({ 
     body:[ 
     // match all query, on all indices and types 
        {}, 
        { query:{ match_all:{}}}, 
    // query_string query, on index/mytype 
    { 
        _index:'myindex', 
        _type:'mytype' 
    },{ 
        query:{ 
            query_string:{ query:'"Test 1"'} 
            } 
    }] 
});

扩展

通过上面基本API的使用,基本可以了解js端对ESclient的操作。当然也可以使用下面的变成风格调用方法:

es[method](params)
它类似
es.method(params,回调方法)

在kibana中的_doc_send_to_es.js,使用了如下的封装:

function (method, validateVersion, body, ignore) {
      // debugger;
      var doc = this;
      // straight assignment will causes undefined values
      var params = _.pick(this._state, ['id', 'type', 'index']);
      params.body = body;
      params.ignore = ignore || [409];

      if (validateVersion && params.id) {
        params.version = doc._getVersion();
      }
      // debugger;
      return es[method](params)
      .then(function (resp) {
        // debugger;
        if (resp.status === 409) throw new errors.VersionConflict(resp);

        doc._storeVersion(resp._version);
        doc.id(resp._id);

        var docFetchProm;
        if (method !== 'index') {
          docFetchProm = doc.fetch();
        } else {
          // we already know what the response will be
          docFetchProm = Promise.resolve({
            _id: resp._id,
            _index: params.index,
            _source: body,
            _type: params.type,
            _version: doc._getVersion(),
            found: true
          });
        }

        // notify pending request for this same document that we have updates
        docFetchProm.then(function (fetchResp) {
          // use the key to compair sources
          var key = doc._versionKey();
          

          // clear the queue and filter out the removed items, pushing the
          // unmatched ones back in.
          var respondTo = requestQueue.splice(0).filter(function (req) {
            var isDoc = req.source._getType() === 'doc';
            var keyMatches = isDoc && req.source._versionKey() === key;
            debugger;
            // put some request back into the queue
            if (!keyMatches) {
              requestQueue.push(req);
              return false;
            }

            return true;
          });

          return courierFetch.fakeFetchThese(respondTo, respondTo.map(function () {
            return _.cloneDeep(fetchResp);
          }));
        });

        return resp._id;
      })
      .catch(function (err) {
        // cast the error
        throw new errors.RequestFailure(err);
      });
    };

因此使用时,又变成了:

xxx.call(this, 'create', false, body, []);

一层一层封装了很多,但是只要慢慢屡清除,就知道怎么使用了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 实用的JS代码段(表单篇)

    整理了下比较实用的Javascript代码段,完整的代码参考 1 多个window.onload方法   由于onload方法时在页面加载完成后,自动调用...

    用户1154259
  • 在Elasticsearch中查询Term Vectors词条向量信息

    这篇文章有点深度,可能需要一些Lucene或者全文检索的背景。由于我也很久没有看过Lucene了,有些地方理解的不对还请多多指正。 更多内容还请参考整理的E...

    用户1154259
  • 极大似然估计的理解与应用

    极大似然估计是概率论中一个很常用的估计方法,在机器学习中的逻辑回归中就是基于它计算的损失函数,因此还是很有必要复习一下它的相关概念的。 背景 先来看看几个小例...

    用户1154259
  • jquery中各个属性的应用

    <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf...

    闵开慧
  • 微生活时光机:去项目中挖掘JS模块化简史

    让我们把眼光投向微生活各个时期项目中的 JS 代码,看一看时代在其中投下的烙印,也许只是管中窥豹、走马观花,但通过其组织形式的异同,或可一瞥 JS 模块化层面的...

    江米小枣
  • js中(function(){})()的写法用处

    后来查了下资料,js中(function(){…})()立即执行函数写法理解,终于了解了。

    帅的一麻皮
  • 前端模块化详解(完整版)

    上例子通过jquery方法将页面的背景颜色改成红色,所以必须先引入jQuery库,就把这个库当作参数传入。这样做除了保证模块的独立性,还使得模块之间的依赖关系变...

    小生方勤
  • phpcms v9 常用函数

    常用函数 , 打开include/global.func.php,下面存放一些公共函数 view plaincopy to clipboardprint? fu...

    joshua317
  • JavaScript高阶函数

    把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计、安全控制、异常处理等 可以保持业务逻辑模块的纯净和高内聚性

    薛定喵君
  • 前端模块化详解(完整版)

    在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可;如今CPU、浏览器性能得到了极大的提升,很多页面逻辑迁移到了客户端(表单验证等),随...

    Nealyang

扫码关注云+社区

领取腾讯云代金券