0
点赞
收藏
分享

微信扫一扫

ElasticSearch学习 - (七)查询详解


条件查询

@Test
public void testQuery() {
String index = "ahut";
String type = "goods";
QueryBuilder query = null;

// ###################################
// 下面会有构建具体query的方法

SearchResponse response = client.prepareSearch(index).setTypes(type).setQuery(query).execute().actionGet();

System.out.println("所有记录数 : " + response.getHits().getTotalHits());

for (SearchHit searchHit : response.getHits()) {
String jsonStr = searchHit.getSourceAsString();
System.out.println(searchHit.getScore() + jsonStr);

查询所有文档

对应的DSL(Domain Specific Language)

{
"query": {
"match_all": {}
}
}

Java代码

query = QueryBuilders.matchAllQuery();

指定文档返回的数量

如果size不指定,那么默认返回10条。
对应的DSL

{
"query": { "match_all": {} },
"size": 1}

Java代码

SearchResponse response = client
.prepareSearch(index)
.setTypes(type)
.setSize(2)//设置返回的最大数量
.setQuery(query)
.execute()
.actionGet();

指定从哪一条记录开始返回

下标从0开始
对应的DSL

{
"query": {
"match_all": {}
},
"from": 2,
"size": 2}

Java代码

SearchResponse response = client
.prepareSearch(index)
.setTypes(type)
.setFrom(2)//设置从多少条数据开始返回,下标从0开始
.setSize(2)//设置返回的最大数量
.setQuery(query)
.execute()
.actionGet();

指定排序规则

对应的DSL

{
"query": {
"match_all": {}
},
"sort": {
"goodsPrice": {
"order": "asc"}
}
}

Java代码

SearchResponse response = client
.prepareSearch(index)
.setTypes(type)
.addSort("goodsPrice", SortOrder.ASC)
.setFrom(2)//设置从多少条数据开始返回,下标从0开始
.setSize(2)//设置返回的最大数量
.setQuery(query)
.execute()
.actionGet();

查询名称包含 数学 的商品

对应的DSL

{
"query": {
"match": {
"goodsName": "数学"}
}
}

Java代码

query = QueryBuilders.matchQuery("goodsName", "数学");

查询名称包含 数学 或者 语文 的商品

对应的DSL

{
"query": {
"match": {
"goodsName": "数学 语文"}
}
}

Java代码

query = QueryBuilders.matchQuery("goodsName", "数学 语文");

查询名称包含 数学 且包含 语文 的商品

对应的DSL

{
"query": {
"match_phrase": {
"goodsName": "数学 语文"}
}
}

Java代码

query = QueryBuilders.matchPhraseQuery("goodsName", "数学 语文");

bool查询

同时包含数学和高等的商品
对应的DSL

{
"query": {
"bool": {
"must": [{
"match": {
"goodsName": "数学"}
},
{
"match": {
"goodsName": "高等"}
}
]
}
}
}

Java代码

query = QueryBuilders.boolQuery().
must(QueryBuilders.matchQuery("goodsName","数学")).
must(QueryBuilders.matchQuery("goodsName", "高等"));

包含数学或者高等的商品
对应的DSL

{
"query": {
"bool": {
"should": [{
"match": {
"goodsName": "数学"}
},
{
"match": {
"goodsName": "高等"}
}
]
}
}
}

Java代码

query = QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("goodsName","数学"))
.should(QueryBuilders.matchQuery("goodsName", "高等"));

排除包含数学或者高等的商品
对应的DSL

{
"query": {
"bool": {
"must_not": [{
"match": {
"goodsName": "数学"}
},
{
"match": {
"goodsName": "高等"}
}
]
}
}
}

Java代码

query = QueryBuilders.boolQuery()
.mustNot(QueryBuilders.matchQuery("goodsName","高等"))
.mustNot(QueryBuilders.matchQuery("goodsName","数学"));

提示:bool查询可以同时使用must, should, must_not组成一个复杂的查询

过滤

查询包含数学且价格高于40的商品信息
对应的DSL

{
"query": {
"bool": {
"must": {
"match": {
"goodsName": "数学"}
},
"filter": {
"range": {
"goodsPrice": { "gte": 40} }
}
}
}
}

Java代码

query = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("goodsName", "数学"))
.filter(QueryBuilders.rangeQuery("goodsPrice").gte(40));


举报

相关推荐

0 条评论