【弄nèng - Elasticsearch】Java API入门篇(二)—— 使用TransportClient,常用查询

该篇博客为elasticsearch 查询语句相关Java Api 事例,包括match,term,prefix等操作。
官网传送门

1. 准备

参考 上一篇博客传送门

2. 事例


import org.apache.lucene.search.join.ScoreMode;
import org.assertj.core.util.Lists;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.search.MultiSearchResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;


/**
 * 查询测试
 */
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class QueryTest {

    @Resource(name = "dataClient")
    private TransportClient client;

    @Test
    public void get() {
        GetResponse response = client.prepareGet("twitter", "tweet", "1")
                .setOperationThreaded(false)
                .execute()
                .actionGet();
        System.out.println(response.getSourceAsString());
    }

    /**
     * 滚动查询--scroll
     */
    @Test
    public void scroll() {
        // QueryBuilder qb = termQuery("name", "sima");

        SearchResponse scrollResp = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setSearchType(SearchType.QUERY_THEN_FETCH)
                .setScroll(new TimeValue(60000))
                // .setQuery(qb)
                //100 hits per shard will be returned for each scroll
                .setSize(100).execute().actionGet();
        // 每次返回100条
        while (true) {
            for (SearchHit hit : scrollResp.getHits().getHits()) {
                System.out.println(hit.sourceAsString());
            }
            scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(600000)).execute().actionGet();
            //Break condition: No hits are returned
            if (scrollResp.getHits().getHits().length == 0) {
                break;
            }
        }
    }

    /**
     * 批量查询--MultiSearch
     */
    @Test
    public void MultiSearch() {
        SearchRequestBuilder srb1 = client.prepareSearch("twitter").setTypes("tweet")
                .setQuery(QueryBuilders.termQuery("name", "sima")).setSize(1);
        SearchRequestBuilder srb2 = client.prepareSearch("twitter").setTypes("tweet")
                .setQuery(QueryBuilders.matchQuery("name", "kimchy")).setSize(1);

        MultiSearchResponse sr = 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();

            System.out.println(nbHits);
        }
    }

    /**
     * prefix前缀查询
     */
    @Test
    public void prefix() {
        //prefixQuery 第一个参数为字段名,后面是以kimchy开头的条件进行查询
        QueryBuilder builder = QueryBuilders.prefixQuery("name", "kimchy");
        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setQuery(builder)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
            //将获取的值转换成map的形式
            Map<String, Object> map = hit.getSource();
            for (String key : map.keySet()) {
                System.out.println(key + " key对应的值为:" + map.get(key));
            }
        }
    }

    /**
     * wildcard查询
     */
    @Test
    public void wildcard() {
        QueryBuilder builder = QueryBuilders.wildcardQuery("name", "kimchy*");
        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setQuery(builder)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
            //将获取的值转换成map的形式
            Map<String, Object> map = hit.getSource();
            for (String key : map.keySet()) {
                System.out.println(key + " key对应的值为:" + map.get(key));
            }
        }
    }

    /**
     * fuzzy模糊查询
     */
    @Test
    public void fuzzy() {
        QueryBuilder builder = QueryBuilders.fuzzyQuery("name", "kimcyh");
        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setQuery(builder)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
            //将获取的值转换成map的形式
            Map<String, Object> map = hit.getSource();
            for (String key : map.keySet()) {
                System.out.println(key + " key对应的值为:" + map.get(key));
            }
        }
    }

    /**
     * term查询
     */
    @Test
    public void term() {
        QueryBuilder builder = QueryBuilders.termQuery("name", "kimchy1");
        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setQuery(builder)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
            //将获取的值转换成map的形式
            Map<String, Object> map = hit.getSource();
            for (String key : map.keySet()) {
                System.out.println(key + " key对应的值为:" + map.get(key));
            }
        }
    }

    /**
     * terms查询
     */
    @Test
    public void terms() {
        List<Long> list = Lists.newArrayList();
        list.add(12345123123L);
        list.add(1231356L);

        QueryBuilder builder = QueryBuilders.termsQuery("postDate", list);
        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setQuery(builder)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
            //将获取的值转换成map的形式
            Map<String, Object> map = hit.getSource();
            for (String key : map.keySet()) {
                System.out.println(key + " key对应的值为:" + map.get(key));
            }
        }
    }

    /**
     * idsQuery
     */
    @Test
    public void idsQuery() {
        QueryBuilder builder = QueryBuilders.idsQuery().addIds("1", "2");
        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setQuery(builder)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
            //将获取的值转换成map的形式
            Map<String, Object> map = hit.getSource();
            for (String key : map.keySet()) {
                System.out.println(key + " key对应的值为:" + map.get(key));
            }
        }
    }

    /**
     * 限制返回字段和分页
     */
    @Test
    public void idsQuery1() {
        QueryBuilder builder = QueryBuilders.idsQuery().addIds("1", "2");
        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setQuery(builder)
                // 分页
                .setFrom(0)
                .setSize(1)
                // 限制返回字段
                .setFetchSource("name", null)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
            //将获取的值转换成map的形式
            Map<String, Object> map = hit.getSource();
            for (String key : map.keySet()) {
                System.out.println(key + " key对应的值为:" + map.get(key));
            }
        }
    }

    /**
     * match查询,分词,适用于text类型的字段
     */
    @Test
    public void match() {
        QueryBuilder builder = QueryBuilders.matchQuery("title", "黑龙江");
        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setQuery(builder)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
    }

    /**
     * multiMatch查询
     */
    @Test
    public void multiMatch() {
        // 搜索name或者title中含有“黑龙江”的文档
        QueryBuilder builder = QueryBuilders.multiMatchQuery("黑龙江", "name", "title");
        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setQuery(builder)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
    }

    /**
     * range查询
     */
    @Test
    public void range() {
        QueryBuilder builder = QueryBuilders.rangeQuery("postDate")
                .from(1574874999000L)
                .to(15748749990001L)
                .includeLower(true) // 包含上届
                .includeUpper(false);// 包含下届

        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setQuery(builder)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
    }

    /**
     * nested查询
     */
    @Test
    public void nestedMatch() {
        BoolQueryBuilder boolBuilder = new BoolQueryBuilder();
        boolBuilder.must(QueryBuilders.termQuery("users.name", "SIMA"));

        QueryBuilder builder = QueryBuilders.nestedQuery("users", boolBuilder, ScoreMode.None);
        SearchResponse response = client.prepareSearch("schools")
                .setTypes("classes")
                .setQuery(builder)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
    }

    /**
     * exists查询
     */
    @Test
    public void exists() {
        QueryBuilder builder =QueryBuilders.existsQuery("title");
        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setQuery(builder)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
    }


    /**
     * bool查询
     */
    @Test
    public void bool() {
        BoolQueryBuilder boolBuilder = new BoolQueryBuilder();
        // AND
        boolBuilder.must(QueryBuilders.termQuery("name", "SIMA"));
        // OR
        boolBuilder.should(QueryBuilders.termQuery("name", "SIMA1"));
        // NOT
        boolBuilder.mustNot(QueryBuilders.termQuery("name", "KILL"));
        // 过滤
        boolBuilder.filter(QueryBuilders.termQuery("price", 2.2D));

        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setQuery(boolBuilder)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }
    }
    
	/**
     * script查询
     */
    @Test
    public void script() {
        Script script = new Script("doc['price'].value > 1");
        ScriptQueryBuilder scriptbuilder = new ScriptQueryBuilder(script);

        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        boolQueryBuilder.must(scriptbuilder);
        SearchResponse response = client.prepareSearch("twitter")
                .setTypes("tweet")
                .setQuery(boolQueryBuilder)
                .get();

        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
            //将获取的值转换成map的形式
            Map<String, Object> map = hit.getSource();
            for (String key : map.keySet()) {
                System.out.println(key + " key对应的值为:" + map.get(key));
            }
        }
    }

}

源码地址见项目推荐


项目推荐

IT-CLOUD :IT服务管理平台,集成基础服务,中间件服务,监控告警服务等。
IT-CLOUD-ACTIVITI6 :Activiti教程源码。博文在本CSDN Activiti系列中。
IT-CLOUD-ELASTICSEARCH :elasticsearch教程源码。博文在本CSDN elasticsearch系列中。

开源项目,持续更新中,喜欢请 Star~

发布了160 篇原创文章 · 获赞 46 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/yy756127197/article/details/103354302