elasticsearch 的 Percolator操作

原创 2015年11月21日 14:59:34

https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/percolate.html
https://berlinbuzzwords.de/session/elasticsearch-percolator
Percolator翻译为过滤器,抽出器的意思。
percolator 操作通过注册查询条件,然后通过percolate请求(包含文档),来查询符合该请求的查询条件;可以用来不存储数据,只存储查询,做为告警使用;
以前我们是通过query来查询文档,Percolator则是通过文档来查询query.
传统设计基于数据的documents,并将它们存储到一个index中,然后通过搜索api定义的查询,获取这些documents。Percolator正好相反,首先你储存到一个查询到index,然后通过percolatorapi以获取这些查询。
查询可以存储的原因来自这样一个事实:在Elasticsearch中document和query都定义为json格式。这允许您通过index api将query嵌入到document中。 Elasticsearch可以依赖percolator,通过document来提取查询。 既然document也定义为json,您可以定义一个percolator在document的请求中。
percolator和它的大部分功能在实时工作,所以percolator query被存入,那么就可以使用percolator
一、CURL测试
根据mapping,创建一个index, field:message

curl -XPUT 'localhost:9200/my-index' -d '{
  "mappings": {
    "my-type": {
      "properties": {
        "message": {
          "type": "string"
        }
      }
    }
  }
}

注册一个query到percolator中:

curl -XPUT 'localhost:9200/my-index/.percolator/1' -d '{
    "query" : {
        "match" : {
            "message" : "bonsai tree"
        }
    }
}'

用一个符合注册的percolator query的document:

curl -XGET 'localhost:9200/my-index/message/_percolate' -d '{
    "doc" : {
        "message" : "A new bonsai tree in the office"
    }
}'

上面的请求将返回下面的信息:

{
    "took" : 19,
    "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
    },
    "total" : 1,
    "matches" : [
        {
          "_index" : "my-index",
          "_id" : "1"
        }
    ]
}

二、JAVA API方式:

/**
 * percolator api操作示例
 * @param IndexName 索引名
 * @param indexType 索引类型
 */
public void  percolator(String IndexName,String indexType) {
    //ES操作客户端
    Client client = getClient();

    //This is the query we're registering in the percolator
    //创建查询条件,并把该查询条件注册到索引中
    QueryBuilder qb = QueryBuilders.termQuery("areaName", "宝安");
    try {
        //Index the query = register it in the percolator
        //把查询条件添加到索引中,myDesignatedQueryName为定义的查询名 
        client.prepareIndex(IndexName, ".percolator", "myDesignatedQueryName")
            .setSource( XContentFactory.jsonBuilder()
                .startObject()
                    // Register the query,添加查询记录
                    .field("query", qb) 
                .endObject())
            .setRefresh(true) // Needed when the query shall be available immediately
            .execute().actionGet();
        //上面的term查询定义名为:myDesignatedQueryName       

        //为了验证一个文档是否符合该查询,创建以下代码:构建一个文档
        //Build a document to check against the percolator
        XContentBuilder docBuilder = XContentFactory.jsonBuilder().startObject();
        //This is needed to designate the document
        docBuilder.field("doc").startObject(); 
        docBuilder.field("areaName", "宝安");
        docBuilder.endObject(); //End of the doc field
        docBuilder.endObject(); //End of the JSON root object

        //Percolate查询
        PercolateResponse response = client.preparePercolate()
                                .setIndices(IndexName)
                                //文档创建时的mapping配置信息名,
                                //如果未修改的话就是索引的type信息
                                .setDocumentType(indexType)
                                //docBuilder构建的文档
                              .setSource(docBuilder).execute().actionGet();

        //Iterate over the results,迭代代码结果,结果处理
       //获取查询query后处理逻辑
        for(PercolateResponse.Match match : response) {
        //创建percolate时指定的ID,根据查询ID在做相应的操作吧
        System.out.println("percolate ID: "+match.getId());
            System.out.println("percolate Index Name: " +match.getIndex());
            //Handle the result which is the name of
            //the query in the percolator
        }       
    } catch (ElasticsearchException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

三、应用场景
https://berlinbuzzwords.de/session/elasticsearch-percolator需要翻墙软件访问
Percolator的这种特性对于以下的应用是非常好的,如数据分类(classification)、数据路由( data aware routing)、事件监控和预警( even alerting and monitoring of events)
事件监控和报警应用:
存储和注册查询过滤条件,监控数据,终端用户可以自定义自己的监控条件;
如:价格监控、新闻监控、股票监控、天气监控

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Elasticsearch 5.X下JAVA API使用指南

Elasticsearch 5.X下JAVA API使用指南 标签: elasticsearch5-0javaapi 2016-12-12 11:45 794人阅读 评论(6) 收藏 举报...

Elasticsearch java API (19)Percolate API

渗透API编辑 过滤器允许一个注册查询索引,然后发送 percolate请求包括医生,回到文档的查询匹配的组注册查询。 阅读的主要渗透在阅读本指南之前文档。//This is ...

Elasticsearch文档的CRUD

索引、类型、文档、字段 索引是ElasticSearch存放数据的地方,可以理解为关系型数据库中的一个数据库。类型用于区分同一个索引下不同的数据类型,相当于关系型数据库中的表文档是ElasticSe...

观察者模式

定义对象间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于他的对象都会得到通知并被自动更新。 有三只动物,Tom猫,Jerry和Jack鼠,当猫叫的时候,触发事件CatShout,然...

Elasticsearch的javaAPI之percolator

Elasticsearch的javaAPI之percolator   percolator允许一个在index中注册queries,然后发送包含doc的请求,返回得到在index中注册过的并且匹配...

elasticsearch java操作的api实例

  • 2017年09月29日 16:39
  • 14.56MB
  • 下载

Percolator 中的分布式事务

Percolator 中的分布式事务Percolator 对外提供两个主要的功能, 一个是分布式事务, 另外一个是 observers, 这里简单介绍一下 Percolator 中分布式事务的实现...
  • xgbjmxn
  • xgbjmxn
  • 2011年02月22日 18:42
  • 645

Elasticsearch中的document数据格式,简单的集群管理,商品的索引的CRUD操作(学习资料记录)

1、Document数据格式面向文档的搜索分析引擎 (1)应用系统的数据结构都是面向对象的,复杂的。 (2)对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式...

elasticsearch__1__java操作之连接es,创建Mapping,保存数据

package com.elasticsearch; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestB...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:elasticsearch 的 Percolator操作
举报原因:
原因补充:

(最多只允许输入30个字)