elasticsearch的javaAPI之query

翻译 2014年11月12日 22:04:07

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
翻译欠佳,希望不会对大家造成误导

关于全文搜索elasticsearch中matchQuery和termQuery的区别

如题,本文主要讲关于全文搜索elasticsearch中matchQuery和termQuery的区别,附带一点其它查询用法。 准备工作,下载相关jar包,本文所有jar包列表: apache-l...
  • yunsyz
  • yunsyz
  • 2016年07月22日 18:10
  • 12897

elasticsearch__4__java操作之QueryBuilders构建搜索Query

内容涉及代码GitHub地址:https://github.com/xiaohulu/util_xiaohulu/tree/master/src/com/elasticsearch 官方API:h...

Elasticsearch Java API 之Query、Filter、count、Aggregations

elasticsearchQuery、Filter、count、Aggregations 的 java api

elasticsearch API 集合

3.3.1 Preparing a query 准备查询请求 import org.elasticsearch.action.search.SearchResponse; import ...
  • swcj
  • swcj
  • 2016年08月16日 14:51
  • 1347

Elasticsearch Java API总汇

三、Elasticsearch Java API 3.1 集群的连接 3.1.1 作为Elasticsearch节点 代码:          import static org.elasti...

Elasticsearch的javaAPI之facet,count,delete by query

Elasticsearch的javaAPI之count count API允许轻松地执行一个查询,获得匹配的数量,可以跨越一个或多个index ,一个或多个type。  import static...

Elasticsearch之scroll

一个search请求只能返回结果的一个单页(10条记录),而scroll API能够用来从一个单一的search请求中检索大量的结果(甚至全部) ,这种行为就像你在一个传统数据库内使用一个游标一样。...

[ElasticSearch]Java API 之 滚动搜索(Scroll API)

一般搜索请求都是返回一"页"数据,无论数据量多大都一起返回给用户,Scroll API可以允许我们检索大量数据(甚至全部数据)。Scroll API允许我们做一个初始阶段搜索并且持续批量从Elasti...

运行elasticsearch报错

一.问题描述: 安装完elasticsearch后,运行报错 root@localhost work]# Exception in thread "main" java.lang.Unsuppor...

Elasticsearch Java Api(六)--DeleteByQuery

参考stackoverflow上的帖子,总结DeleteByQuery的java api
  • napoay
  • napoay
  • 2016年07月26日 19:06
  • 8042
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:elasticsearch的javaAPI之query
举报原因:
原因补充:

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