3-Elasticsearch查询API

来源:互联网 发布:窗户打开方式 知乎 编辑:程序博客网 时间:2024/06/06 04:22

在上一节2-Elasticsearch集群数据批量导入中,我们向ES集群中批量导入了1000条数据。这一节通过Java API查询文档。

1、全文查询

查询文档中包含Beijing关键字的doc,不管该关键字出现在哪个字段中,只要包含都会返回。

public class QueryMain {    private static final Logger logger = LogManager.getLogger(QueryMain.class);    public static QueryBuilder createQuery() {        return QueryBuilders.queryStringQuery("Beijing");    }    public static void main(String[] args) {        try {            ESConfig esConfig = new ESConfig()                    .setEsClusterName("elasticsearch")                    .setEsClusterAddress("127.0.0.1:9300")                    .setEsIndex("person")                    .setEsType("infos");            // 创建客户端            Client client = new ESClient().getElasticsearchClient(esConfig);            // 查询            SearchResponse response = client.prepareSearch().setQuery(createQuery()).execute().actionGet();            // 返回结果            SearchHits hits = response.getHits();            for (SearchHit hit : hits) {                System.out.println(hit.getSourceAsString());            }        } catch (Exception e) {            logger.error("exception:", e);        }    }}

返回结果:

{"pid":93,"age":28,"sex":true,"name":"Lily","addr":"Beijing"}{"pid":168,"age":16,"sex":false,"name":"Tom","addr":"Beijing"}{"pid":214,"age":35,"sex":false,"name":"Tom","addr":"Beijing"}{"pid":226,"age":77,"sex":true,"name":"Jenny","addr":"Beijing"}{"pid":276,"age":19,"sex":false,"name":"Bill","addr":"Beijing"}{"pid":384,"age":62,"sex":false,"name":"Brown","addr":"Beijing"}{"pid":459,"age":69,"sex":true,"name":"Jenny","addr":"Beijing"}{"pid":531,"age":38,"sex":false,"name":"Brown","addr":"Beijing"}{"pid":536,"age":77,"sex":true,"name":"Lily","addr":"Beijing"}{"pid":574,"age":59,"sex":true,"name":"Lily","addr":"Beijing"}

2、按字段条件查询

如果需要查询(addr = Beijing) && (sex = false) && (10 < age < 20)的doc:

    public static QueryBuilder createQuery() {        BoolQueryBuilder query = QueryBuilders.boolQuery();        // addr = Beijing        query.must(new QueryStringQueryBuilder("Beijing").field("addr"));        // sex = falese        query.must(new QueryStringQueryBuilder("false").field("sex"));        // age ∈ (10, 20)        query.must(new RangeQueryBuilder("age").gt(10).lt(20));        return query;    }

返回结果:

{"pid":168,"age":16,"sex":false,"name":"Tom","addr":"Beijing"}{"pid":276,"age":19,"sex":false,"name":"Bill","addr":"Beijing"}{"pid":565,"age":16,"sex":false,"name":"Brown","addr":"Beijing"}{"pid":73,"age":13,"sex":false,"name":"David","addr":"Beijing"}

3、查询API

3.1 基本查询

QueryBuilder query = QueryBuilders.matchPhraseQuery("addr", "Beijing");

只要doc字段中含有Beijing的短语都会返回。

3.2 多词条查询

QueryBuilder query = QueryBuilders.termsQuery("addr", "Beijing", "Shanghai");

Beijing、Shanghai在addr字段中进行查询,只要满足一个就会返回。但是,并不会返回二者的并集。

3.3 matchAll查询

QueryBuilder query = QueryBuilders.matchAllQuery();

3.4 常用词查询

QueryBuilder query = QueryBuilders.commonTermsQuery("addr", "Beijing");

3.5 multiMatch查询

QueryBuilder query = QueryBuilders.multiMatchQuery("Beijing", "addr", "name");

在addr、name字段中查找关键字为Beijing的doc。

3.6 queryString查询

QueryBuilder query = QueryBuilders.queryStringQuery("Beijing");

3.7 simpleQueryString查询

QueryBuilder query = QueryBuilders.simpleQueryStringQuery("Beijing");

3.8 前缀查询

QueryBuilder query = QueryBuilders.prefixQuery("addr", "Bei");

3.9 模糊查询

QueryBuilder query = QueryBuilders.fuzzyQuery("addr", "BeiJing");

3.10 通配符查询

QueryBuilder query = QueryBuilders.wildcardQuery("addr", "Bei*");

3.11 Range查询

// 闭区间QueryBuilder query = QueryBuilders.rangeQuery("age").from(10).to(20);// 开区间QueryBuilder query = QueryBuilders.rangeQuery("age").gt(10).lt(20);