yanran/ElasticSearch-demo (gitee.com)https://gitee.com/yanran00/elastic-search-demo
1. 查询结果分析
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 30,---------------------------response.getHits().getTotalHits().value [Long]
"relation" : "eq"
},
"max_score" : 2.0645075,
"hits" : [--------------------------------response.getHits().getHits() [array]
{
"_index" : "hotel",
"_type" : "_doc",
"_id" : "sP7vbYIBeL0jRZbFalKk",
"_score" : 2.0645075,
"_source" : {-------------------------response.getHits().getHits()[0].getSourceAsString() [json-String]
"brand" : "如家",
"id" : 339952837,
"location" : "39.73167, 116.132482",
"name" : "如家酒店(北京良乡西路店)",
"price" : 159,
"score" : 46,
},
"highlight" : {-----------------------response.getHits().getHits()[0].getHighlightFields() [map]
"name" : [------------------------(map)highlightFields.get("name").getFragments() [array]
"<em>如家</em>酒店"
]
},
"sort" : [-----------------------response.getHits().getHits()[0].getSortValues();[Object[]]
3299,
12395.153
]
}
]
}
}
2. DSL语句分析
- 简单查询
2.1 查询所有
GET /hotel/_search
{-----------------searchRequest.source().query(QueryBuilders.matchAllQuery());
"query": {
"match_all": {}
}
}
2.2 查询名称包含如家的文档,(会先分词再检索)
GET /hotel/_search
{-----------------searchRequest.source().query(QueryBuilders.matchQuery("name","如家"));
"query": {
"match": {
"name": "如家"
}
}
}
2.3 多条件查询
GET /hotel/_search
{---------------------searchRequest.source().query(QueryBuilders.multiMatchQuery("如家", "name","brand"));
"query": {
"multi_match": {
"query": "上海如家",
"fields": ["brand","name","city"]
}
}
}
GET /hotel/_search
{--------------------------searchRequest.source().query(QueryBuilders.matchQuery("all","如家"));
"query": {
"match": {
"all": "上海如家"
}
}
}
2.4 精确查询term/range
#term
GET /hotel/_search
{--------------------------searchRequest.source()
.query(QueryBuilders.termQuery("city", "北京"));
"query": {
"term": {
"city": {
"value": "北京"
}
}
}
}
#range
GET /hotel/_search
{----------------------------searchRequest.source()
.query(QueryBuilders.rangeQuery("price").lte(1000).gte(900));
"query": {
"range": {
"price": {
"gte": 900,
"lte": 1000
}
}
}
}
2.5 地理坐标查询
# 矩形地理坐标查询(geo_bounding_box)
GET /hotel/_search
{------------------------------searchRequest.source() .query(QueryBuilders.geoBoundingBoxQuery("location").setCorners("坐上", "右下"));
"query": {
"geo_bounding_box": {
"location": {
"top_left": {
"lat": 31.1,
"lon": 121.5
},
"bottom_right": {
"lat": 30.9,
"lon": 121.7
}
}
}
}
}
#附近查询,距离查询(geo_distance)
GET /hotel/_search
{---------------------------searchRequest.source()
.query(QueryBuilders.geoDistanceQuery("location").distance(10,DistanceUnit.KILOMETERS));
"query": {
"geo_distance": {
"distance": "15km",
"location": "31.21,121.5"
}
}
}
- 复合查询
2.6 算分查询
# 算分函数查询,给上海酒店中的如家排名提前一些
# 三个点:
原来的文档(function_score)、
过滤出来的要加分的文档(filter)、
如何加分(weight、boost——mode)dai
代码演示:
FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery( boolQuery,//目前的查询条件得到的doc new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{ new FunctionScoreQueryBuilder.FilterFunctionBuilder( QueryBuilders.termQuery("isAD", true), //过滤条件 ScoreFunctionBuilders.weightFactorFunction(10)//加分权重 )})//权重与与原分数的计算方式 .boostMode(CombineFunction.MULTIPLY); searchRequest.source().query(functionScoreQuery);
2.7 布尔查询
GET /hotel/_search
{
"query": {
"bool": {---------------BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
"must": [-------------boolQuery.must(QueryBuilders.termQuery("city", "上海"));
(后面可以继续链式编程)
{
"term": {
"city": {
"value": "上海"
}
}
}
],
"must_not": [----------boolQuery.mustNot(QueryBuilders.rangeQuery("price")
.lte(maxPrice).gte(minPrice));
{
"range": {
"price": {
"gte": 500
}
}
}
],
"should": [--------- boolQuery.should(QueryBuilders.termQuery("brand", "如家"))
.should(QueryBuilders.termQuery("brand", "万怡"));
{
"term": {
"brand": {
"value": "如家"
}
}
},
{
"term": {
"brand": {
"value": "万怡"
}
}
}
],
"filter": [---------boolQuery.filter(QueryBuilders.rangeQuery("score")
.gte(40));
{
"range": {
"score": {
"gte": 40
}
}
}
]
}
},
"from": 0,
"size": 20
}
2.8 查询结果排序
# 普通字段排序
GET /hotel/_search
{
"query": {------------searchRequest.source().query(QueryBuilders.matchAllQuery());
"match_all": {}
}
, "sort": [-----------searchRequest.source().sort("price",SortOrder.DESC);
{
"price": {
"order": "desc"
}
}
]
}
# 地理坐标排序
GET /hotel/_search
{
"query": {
"match_all": {}
}
,
"sort": [
{
"_geo_distance": {
"location": {
"lat": 30,
"lon": 120
},
"order": "asc",
"unit": "km"
}
}
]
-----------searchRequest.source().sort(
SortBuilders.geoDistanceSort("location",new GeoPoint(location))
//location 是地理坐标的字符串
.order(SortOrder.ASC).unit(DistanceUnit.KILOMETERS))
.sort("price", SortOrder.ASC);
(链式编程实现多字段排序)
}
2.9 查询结果高亮
# 查询字段与要参与高亮的字段不一致时
GET /hotel/_search
{
"query": {
"match": {
"all": "如家"
}
},
"highlight": {-----------------searchRequest.source().highlighter(
new HighlightBuilder().field("name")
.requireFieldMatch(false));
"fields": {
"name": {
"require_field_match": "false"
}
}
}
}