elastisearch javaApi之搜索基础知识

搜索API编辑

搜索API允许执行搜索查询并取回匹配查询的搜索匹配。它可以跨越一个或多个索引并跨越一种或多种类型执行。该查询可以使用查询Java API提供。搜索请求的主体是使用SearchSourceBuilder。这里是一个例子:

import org.elasticsearch.action.search.SearchResponse;

import org.elasticsearch.action.search.SearchType;

import org.elasticsearch.index.query.QueryBuilders.*;

SearchResponse response = client.prepareSearch("index1", "index2")

        .setTypes("type1", "type2")

        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

        .setQuery(QueryBuilders.termQuery("multi", "test"))                 // Query

        .setPostFilter(QueryBuilders.rangeQuery("age").from(12).to(18))     // Filter

        .setFrom(0).setSize(60).setExplain(true)

        .get();

请注意,所有参数都是可选的。以下是您可以撰写的最小搜索电话:

//使用所有默认选项对整个集群进行MatchAll

SearchResponse response = client.prepareSearch().get();

虽然Java API定义了额外的搜索类型QUERY_AND_FETCH和DFS_QUERY_AND_FETCH,但这些模式是内部优化,不应该由API的用户明确指定。

 

 

«使用聚合  搜索模板» 

终止编辑后

为每个分片收集的文档的最大数量,一旦达到该数量,查询执行将提前终止。如果设置,您就可以检查是否通过操作要求提前终止isTerminatedEarly() SearchResponseonject:

SearchResponse sr = client.prepareSearch(INDEX)

    .setTerminateAfter(1000)    

    .get();

 

if (sr.isTerminatedEarly()) {

    // We finished early

}

 

 

“  聚集后终止 

搜索模板编辑

请参阅搜索模板文档

将模板参数定义为Map<String,Object>

Map<String, Object> template_params = new HashMap<>();

template_params.put("param_gender", "male");

 

您可以在中使用您存储的搜索模板config/scripts。例如,如果您有一个名为config/scripts/template_gender.mustache包含的文件:

{

    "template" : {

        "query" : {

            "match" : {

                "gender" : "{{param_gender}}"

            }

        }

    }

}

 

创建您的搜索模板请求:

SearchResponse sr = new SearchTemplateRequestBuilder(client)

    .setScript("template_gender")                 

    .setScriptType(ScriptService.ScriptType.FILE)

    .setScriptParams(template_params)             

    .setRequest(new SearchRequest())              

    .get()                                        

    .getResponse();                               

 

模板名称

模板存储在磁盘中 gender_template.mustache

参数

设置执行上下文(即在此定义索引名称)

执行并获取模板响应

从模板响应搜索响应本身

您还可以将模板存储在群集状态中:

client.admin().cluster().preparePutStoredScript()

    .setScriptLang("mustache")

    .setId("template_gender")

    .setSource(new BytesArray(

        "{\n" +

        "    \"template\" : {\n" +

        "        \"query\" : {\n" +

        "            \"match\" : {\n" +

        "                \"gender\" : \"{{param_gender}}\"\n" +

        "            }\n" +

        "        }\n" +

        "    }\n" +

        "}")).get();

 

要执行存储的模板,请使用ScriptService.ScriptType.STORED

SearchResponse sr = new SearchTemplateRequestBuilder(client)

        .setScript("template_gender")                       

        .setScriptType(ScriptType.STORED)     

        .setScriptParams(template_params)                   

        .setRequest(new SearchRequest())                    

        .get()                                              

        .getResponse();                                     

 

模板名称

模板存储在集群状态

参数

设置执行上下文(即在此定义索引名称)

执行并获取模板响应

从模板响应搜索响应本身

您也可以执行内联模板:

sr = new SearchTemplateRequestBuilder(client)

        .setScript("{\n" +                                  

                "        \"query\" : {\n" +

                "            \"match\" : {\n" +

                "                \"gender\" : \"{{param_gender}}\"\n" +

                "            }\n" +

                "        }\n" +

                "}")

        .setScriptType(ScriptType.INLINE)    

        .setScriptParams(template_params)                  

        .setRequest(new SearchRequest())                   

        .get()                                             

        .getResponse();                                    

 

模板名称

模板内联传递

参数

设置执行上下文(即在此定义索引名称)

执行并获取模板响应

从模板响应搜索响应本身

 

 

 

聚合编辑

Elasticsearch提供了一个完整的Java API来玩聚合。请参阅 聚合指南

使用工厂生成聚合构建器(AggregationBuilders),并在查询时添加要计算的每个聚合并将其添加到搜索请求中:

SearchResponse sr = node.client().prepareSearch()

        .setQuery( /* your query */ )

        .addAggregation( /* add an aggregation */ )

        .execute().actionGet();

请注意,您可以添加多个聚合。详细信息请参阅 搜索Java API

要构建聚合请求,请使用AggregationBuilders助手。只需将它们导入你的课堂:

import org.elasticsearch.search.aggregations.AggregationBuilders;

构建聚合

“ 聚合指南中所述,您可以在 聚合中定义子聚合。

聚合可以是度量聚合或桶聚合。

例如,这里是一个3级聚合组成:

· 术语聚合(桶)

· 日期直方图聚合(存储区)

· 平均聚合(度量)

SearchResponse sr = node.client().prepareSearch()

    .addAggregation(

        AggregationBuilders.terms("by_country").field("country")

        .subAggregation(AggregationBuilders.dateHistogram("by_year")

            .field("dateOfBirth")

            .dateHistogramInterval(DateHistogramInterval.YEAR)

            .subAggregation(AggregationBuilders.avg("avg_children").field("children"))

        )

    )

    .execute().actionGet();

阅读更多
个人分类: elasticsearch
上一篇elasticsearch客户端基于索引,文档的增删改查操作
下一篇spring4.0中 @Component @ComponentScan @Configuration @Bean @Autowired在自动装配中的使用
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭