java query api_elasticsearch的javaAPI之query

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,而 scrollAPI可以用一个搜索语句,检索大量的结果(甚至所有的结果),与传统的使用游标查询数据库一样。

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也是不错的选择

翻译欠佳,希望不会对大家造成误导

作者:woshiyexinjie 发表于2014-11-12 22:04:07 原文链接

阅读:85 评论:0 查看评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值