条件查询
@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));