elasticsearch的javaAPI之query

标签: elasticsearch javaapi query | 发表时间:2014-11-12 22:04 | 作者:woshiyexinjie
分享到:
出处:http://blog.csdn.net

elasticsearch的javaAPI之query API

the Search API允许执行一个搜索查询,返回一个与查询匹配的结果(hits)。 它可以在跨一个或多个index上执行, 或者一个或多个types。 查询可以使用提供的 query Java API 或filter Java API 。 搜索请求的主体是建立使用 SearchSourceBuilder上。 这里有一个例子:

import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.index.query.FilterBuilders.*;
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(FilterBuilders.rangeFilter("age").from(12).to(18))   // Filter
        .setFrom(0).setSize(60).setExplain(true)
        .execute()
        .actionGet();

请注意,所有参数都是可选的。 这是你可以写的最小的搜索:

// MatchAll on the whole cluster with all default options
SearchResponse response = client.prepareSearch().execute().actionGet();

在Java中使用scrolls

scroll documentation

一个 搜索请求返回类似a“page”of result,而 scroll API可以用一个搜索语句,检索大量的结果(甚至所有的结果),与传统的使用游标查询数据库一样。

scrolling不用于实时请求,而是处理大量的数据,例如为了不同的配置,重建索引的内容

 

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

QueryBuilder qb = termQuery("multi", "test");

SearchResponse scrollResp = client.prepareSearch(test)
        .setSearchType(SearchType.SCAN)
        .setScroll(new TimeValue(60000))
        .setQuery(qb)
        .setSize(100).execute().actionGet(); //100 hits per shard will be returned for each scroll
//Scroll until no hits are returned
while (true) {

    for (SearchHit hit : scrollResp.getHits()) {
        //Handle the hit...
    }
    scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(600000)).execute().actionGet();
    //Break condition: No hits are returned
    if (scrollResp.getHits().getHits().length == 0) {
        break;
    }
}

线程操作

The search API允许你设置线程来执行操作,这样实际姜执行API上执行的是相同的节点上(API上执行一个分配在同一服务器的shard上)。

这里有三种threading modes, The NO_THREADS 模式意味着查询操作将zaicalling thread上执行。 SINGLE_THREAD 模式意味着将对local shards执行搜索操作,是在single different thread。 THREAD_PER_SHARD 意味着搜索操作将在不同的线程上执行,对于每一个local shard。

默认的模式是 THREAD_PER_SHARD

MultiSearch API

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

MultiSearchResponse sr = node.client().prepareMultiSearch()
        .add(srb1)
        .add(srb2)
        .execute().actionGet();

// 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();
}

Using facets

下面的代码显示了如何在你的搜索里添加两个facets:

SearchResponse sr = node.client().prepareSearch()
    .setQuery(QueryBuilders.matchAllQuery())
    .addFacet(FacetBuilders.termsFacet("f1").field("field"))
    .addFacet(FacetBuilders.dateHistogramFacet("f2").field("birth").interval("year"))
    .execute().actionGet();

// Get your facet results
TermsFacet f1 = (TermsFacet) sr.getFacets().facetsAsMap().get("f1");
DateHistogramFacet f2 = (DateHistogramFacet) sr.getFacets().facetsAsMap().get("f2");
例子是facets的,但是Elasticsearch Aggregations也是不错的选择
 
原文:  http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/search.html#msearch
翻译欠佳,希望不会对大家造成误导
作者:woshiyexinjie 发表于2014-11-12 22:04:07 原文链接
阅读:85 评论:0 查看评论

相关 [elasticsearch javaapi query] 推荐:

elasticsearch的javaAPI之query

- - CSDN博客云计算推荐文章
elasticsearch的javaAPI之query API. the Search API允许执行一个搜索查询,返回一个与查询匹配的结果(hits). 它可以在跨一个或多个index上执行, 或者一个或多个types. 查询可以使用提供的 query Java API 或filter Java API.

Elasticsearch搜索类型(query type)详解

- - ITeye博客
欢迎发送邮件至 donlianli@126.com. 请支持原创 http://donlianli.iteye.com/blog/2094305. es在查询时,可以指定搜索类型为QUERY_THEN_FETCH,QUERY_AND_FEATCH,DFS_QUERY_THEN_FEATCH和DFS_QUERY_AND_FEATCH.

通过Function Score Query优化Elasticsearch搜索结果

- - ScienJus's Blog
在使用 Elasticsearch 进行全文搜索时,搜索结果默认会以文档的相关度进行排序,如果想要改变默认的排序规则,也可以通过 sort指定一个或多个排序字段. 但是使用 sort排序过于绝对,它会直接忽略掉文档本身的相关度(根本不会去计算). 在很多时候这样做的效果并不好,这时候就需要对多个字段进行综合评估,得出一个最终的排序.

巧用query cache

- - OurMySQL
   收到一用户反馈其应用日志中狂报错误,获取连接超时:. 同时应用报错超出了数据库的最大连接数:max connections:. 这种情况很有可能是有慢sql占用了连接池中的连接没有释放,导致后续进来的请求迟迟获取不到连接池中的连接,导致请求报错,登录数据库排查发现如下sql出现执行非常的慢:.

MySQL Query Cache 小结

- Eneri - Sky.Jian 朝阳的天空
最近经常有人问我 MySQL Query Cache 相关的问题,就整理一点 MySQL Query Cache 的内容,以供参考. 顾名思义,MySQL Query Cache 就是用来缓存和 Query 相关的数据的. 具体来说,Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集.

Hbase调用JavaAPI实现批量导入操作

- - CSDN博客云计算推荐文章
将手机上网日志文件批量导入到Hbase中,操作步骤:. 1、将日志文件(请下载附件)上传到HDFS中,利用hadoop的操作命令上传:hadoop  fs -put input  /. 2、创建Hbase表,通过Java操作.     // hbase操作必备  .         // 使用eclipse时必须添加这个,否则无法定位  .

MYSQL 中query_cache_size小结

- - jackyrong
   MySQL查询缓存保存查询返回的完整结果. 当查询命中该缓存,会立刻返回结果,跳过了解析,优化和执行阶段. 查询缓存会跟踪查询中涉及的每个表,如果这写表发生变化,那么和这个表相关的所有缓存都将失效. 但是随着服务器功能的强大,查询缓存也可能成为整个服务器的资源竞争单点.    默认这个开关是关闭的,就是禁止使用query_cache,查询是否使用语句如下:.

[译]elasticsearch mapping

- - an74520的专栏
es的mapping设置很关键,mapping设置不到位可能导致索引重建. 请看下面各个类型介绍^_^. 每一个JSON字段可以被映射到一个特定的核心类型. JSON本身已经为我们提供了一些输入,支持 string,  integer/ long,  float/ double,  boolean, and  null..

Elasticsearch as Database - taowen - SegmentFault

- -
【北京上地】滴滴出行基础平台部招聘 Elasticsearch 与 Mysql binlog databus 开发工程师. 内推简历投递给: taowen@didichuxing.com. 推销Elasticsearch. 时间序列数据库的秘密(1)—— 介绍. 时间序列数据库的秘密(2)——索引.