ES之JAVA操作

连接Client

// 按集群名称创建
		/**
		 * clusterName需要跟elasticsearch.yml里的clusterName相同
		 */
		Settings settings = Settings.builder().put("cluster.name", clusterName)//设置ES实例的名称
				.put("client.transport.sniff", true)//增加自动嗅探配置
				.build();
		/**
		 * 1、ip在cmd中用config查看,必须为本机号。 2、启动ES的bin目录下的ES.bat文件。 3、创建客户端。
		 */
		searchClient = new PreBuiltTransportClient(settings)
				.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), port));

Index API

这里我只推荐使用MAP方式和官方的XContentBuilder帮助类方式

/**  
 * 使用集合  
 */  
@Test  
public void CreateList(){  

    Map<String, Object> json = new HashMap<String, Object>();  
    json.put("user","kimchy");  
    json.put("postDate","2013-01-30");  
    json.put("message","trying out Elasticsearch");  

    IndexResponse response = client.prepareIndex("fendo", "fendodate")  
            .setSource(json)  
            .get();  
    System.out.println(response.getResult());  

}
/**  
 * 使用ElasticSearch 帮助类  
 * @throws IOException   
 */  
@Test  
public void CreateXContentBuilder() throws IOException{  

    XContentBuilder builder = XContentFactory.jsonBuilder()  
            .startObject()  
                .field("user", "ccse")  
                .field("postDate", new Date())  
                .field("message", "this is Elasticsearch")  
            .endObject();  

    IndexResponse response = client.prepareIndex("fendo", "fendodata").setSource(builder).get();  
    System.out.println("创建成功!");  


}

Get API

operationThreaded 设置为 true 是在不同的线程里执行此次操作

GetResponse response = client.prepareGet("twitter", "tweet", "1")
        .setOperationThreaded(false)
        .get();

Delete API

根据id删除

DeleteResponse response = client.prepareDelete("twitter", "tweet", "1").get();

Delete By Query API

通过查询条件删除
BulkByScrollResponse response =
    DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
        .filter(QueryBuilders.matchQuery("gender", "male")) //查询条件
        .source("persons") //index(索引名)
        .get();  //执行

long deleted = response.getDeleted(); //删除文档的数量

Update API

使用UpdateRequest
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index("index");
updateRequest.type("type");
updateRequest.id("1");
updateRequest.doc(jsonBuilder()
        .startObject()
            .field("gender", "male")
        .endObject());
client.update(updateRequest).get();

一次获取多个文档

MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
    .add("twitter", "tweet", "1") //一个id的方式
    .add("twitter", "tweet", "2", "3", "4") //多个id的方式
    .add("another", "type", "foo")  //可以从另外一个索引获取
    .get();

for (MultiGetItemResponse itemResponse : multiGetItemResponses) { //迭代返回值
    GetResponse response = itemResponse.getResponse();
    if (response.isExists()) {      //判断是否存在                
        String json = response.getSourceAsString(); //_source 字段
    }
}

同时执行多个搜索请求

SearchRequestBuilder srb1 = client
    .prepareSearch().setQuery(QueryBuilders.queryStringQuery("elasticsearch")).setSize(1);
SearchRequestBuilder srb2 = client
    .prepareSearch().setQuery(QueryBuilders.matchQuery("name", "kimchy")).setSize(1);

MultiSearchResponse sr = client.prepareMultiSearch()
        .add(srb1)
        .add(srb2)
        .get();

// You will get all individual responses from MultiSearchResponse#getResponses()
long nbHits = 0;
for (MultiSearchResponse.Item item : sr.getResponses()) {
    SearchResponse response = item.getResponse();
    nbHits += response.getHits().getTotalHits();
}

聚合框架

聚合框架有助于根据搜索查询提供聚合数据。它是基于简单的构建块也称为整合,整合就是将复杂的数据摘要有序的放在一块。

聚合可以被看做是从一组文件中获取分析信息的一系列工作的统称。聚合的实现过程就是定义这个文档集的过程(例如,在搜索请求的基础上,执行查询/过滤,才能得到高水平的聚合结果)。

SearchResponse sr = client.prepareSearch()
    .setQuery(QueryBuilders.matchAllQuery())
    .addAggregation(
            AggregationBuilders.terms("agg1").field("field")
    )
    .addAggregation(
            AggregationBuilders.dateHistogram("agg2")
                    .field("birth")
                    .dateHistogramInterval(DateHistogramInterval.YEAR)
    )
    .get();

// Get your facet results
Terms agg1 = sr.getAggregations().get("agg1");
Histogram agg2 = sr.getAggregations().get("agg2");

获取文档的最大数量

SearchResponse sr = client.prepareSearch(INDEX)
    .setTerminateAfter(1000)    //如果达到这个数量,提前终止
    .get();

if (sr.isTerminatedEarly()) {
    // We finished early
}

最小值聚合使用

创建聚合请求:

MinAggregationBuilder aggregation =
        AggregationBuilders
                .min("agg")
                .field("height");

使用:

// sr is here your SearchResponse object
Min agg = sr.getAggregations().get("agg");
double value = agg.getValue();

最大值聚合

MaxAggregationBuilder aggregation =
        AggregationBuilders
                .max("agg")
                .field("height");
// sr is here your SearchResponse object
Max agg = sr.getAggregations().get("agg");
double value = agg.getValue();
求和聚合
SumAggregationBuilder aggregation =
        AggregationBuilders
                .sum("agg")
                .field("height");
// sr is here your SearchResponse object
Sum agg = sr.getAggregations().get("agg");
double value = agg.getValue();

平均值聚合

AvgAggregationBuilder aggregation =
        AggregationBuilders
                .avg("agg")
                .field("height");
// sr is here your SearchResponse object
Avg agg = sr.getAggregations().get("agg");
double value = agg.getValue();
统计聚合

统计聚合——基于文档的某个值,计算出一些统计信息(min、max、sum、count、avg), 用于计算的值可以是特定的数值型字段,也可以通过脚本计算而来。

下面是如何创建聚合请求的是示例:

StatsAggregationBuilder aggregation =
        AggregationBuilders
                .stats("agg")
                .field("height");
使用聚合请求
import org.elasticsearch.search.aggregations.metrics.stats.Stats;
// sr is here your SearchResponse object
Stats agg = sr.getAggregations().get("agg");
double min = agg.getMin();
double max = agg.getMax();
double avg = agg.getAvg();
double sum = agg.getSum();
long count = agg.getCount();
过滤聚合

过滤聚合——基于一个条件,来对当前的文档进行过滤的聚合。

AggregationBuilders
    .filter("agg", QueryBuilders.termQuery("gender", "male"));
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
// sr is here your SearchResponse object
Filter agg = sr.getAggregations().get("agg");
agg.getDocCount(); // Doc count

Match All Query

最简单的查询,它匹配所有文档

QueryBuilder qb = matchAllQuery();

匹配查询

用于执行全文查询的标准查询,包括模糊匹配和词组或邻近程度的查询
QueryBuilder qb = matchQuery(
    "name",                  //field 字段
    "kimchy elasticsearch"   // text 
);

多字段查询

可以用来对多个字段的版本进行匹配查询
QueryBuilder qb = multiMatchQuery(
    "kimchy elasticsearch", //text
    "user", "message"       //fields 多个字段
);

ID查询 

查询具有指定类型和 ID 的文档

QueryBuilder qb = idsQuery("my_type", "type2")
    .addIds("1", "4", "100");

QueryBuilder qb = idsQuery()  // type 是可选择的,可以不写
    .addIds("1", "4", "100");

前缀查询

查找指定字段包含以指定的精确前缀开头的值的文档。
QueryBuilder qb = prefixQuery(
    "brand",    //field
    "heine"     //prefix
);











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值