索引2个文档到 hotel 索引中:
PUT /hotel/_doc/1
{"title": "文雅酒店","city": "青岛","price": 556,"create_time": "20200418120000","amenities": "浴池,普通停车场/充电停车场","full_room": false,"location": {"lat": 36.083078,"lon": 120.37566},"praise": 10
}PUT /hotel/_doc/2
{"title": "金都嘉怡假日酒店","city": "北京","price": 337,"create_time": "20210315200000","amenities": "wifi,充电停车场/可升降停车场","full_room": false,"location": {"lat": 39.915153,"lon": 116.403},"praise": 60
}
GET /hotel/_search
{"took" : 499,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "hotel","_type" : "_doc","_id" : "2","_score" : 1.0,"_source" : {"title" : "金都嘉怡假日酒店","city" : "北京","price" : 337,"create_time" : "20210315200000","amenities" : "wifi,充电停车场/可升降停车场","full_room" : false,"location" : {"lat" : 39.915153,"lon" : 116.403},"praise" : 60}},{"_index" : "hotel","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"title" : "文雅酒店","city" : "青岛","price" : 556,"create_time" : "20200418120000","amenities" : "浴池,普通停车场/充电停车场","full_room" : false,"location" : {"lat" : 36.083078,"lon" : 120.37566},"praise" : 10}}]}
}
took
值告诉我们执行整个搜索请求耗费了多少毫秒。
_shards
部分告诉我们在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。正常情况下我们不希望分片失败,但是分片失败是可能发生的。如果我们遭遇到一种灾难级别的故障,在这个故障中丢失了相同分片的原始数据和副本,那么对这个分片将没有可用副本来对搜索请求作出响应。假若这样,Elasticsearch 将报告这个分片是失败的,但是会继续返回剩余分片的结果。
timed_out
值告诉我们查询是否超时。默认情况下,搜索请求不会超时。
返回结果中最重要的部分是 hits
,它包含 total
字段来表示匹配到的文档总数,并且一个 hits
数组包含所查询结果的前十个文档。在解析搜索结果时,我们通常需要关注以下几个字段:
hits.total.value:匹配的文档总数。
hits.max_score:与查询所匹配文档的_score的最大值。
hits.hits:匹配的文档列表。
hits.hits._source:匹配的文档的原始数据。
hits.hits._score:匹配的文档的分数。它衡量了文档与查询的匹配程度,默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照score 降序排列的。
hits.hits.highlight:匹配的文档的高亮显示信息。
@Slf4j
@Service
public class ElasticSearchImpl {@Autowiredprivate RestHighLevelClient restHighLevelClient;public void searchUser() throws IOException {SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();SearchRequest searchRequest = new SearchRequest(new String[]{"hotel"},searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);TimeValue took = searchResponse.getTook();System.out.println("took = " + took);// 搜索结果SearchHits searchHits = searchResponse.getHits();// hits.total.value:匹配的文档总数TotalHits totalHits = searchHits.getTotalHits();long value = totalHits.value;System.out.println("value = " + value);// hits.max_score:与查询所匹配文档的_score的最大值float maxScore = searchHits.getMaxScore();System.out.println("maxScore = " + maxScore);// hits.hits:匹配的文档列表SearchHit[] hits = searchHits.getHits();for (SearchHit hit : hits) {// hits.hits._source:匹配的文档的原始数据String sourceAsString = hit.getSourceAsString();System.out.println("sourceAsString = " + sourceAsString);// hits.hits._id:匹配的文档的idString id = hit.getId();System.out.println("id = " + id);Map fields = hit.getFields();System.out.println("fields = " + fields);String index = hit.getIndex();System.out.println("index = " + index);float score = hit.getScore();System.out.println("score = " + score);}System.out.println(searchResponse);}
}
took=2ms
value = 2
maxScore = 1.0sourceAsString = {"title":"金都嘉怡假日酒店","city":"北京","price":337,"create_time":"20210315200000","amenities":"wifi,充电停车场/可升降停车场","full_room":false,"location":{"lat":39.915153,"lon":116.403},"praise":60}
id = 2
fields = {}
index = hotel
score = 1.0sourceAsString = {"title":"文雅酒店","city":"青岛","price":556,"create_time":"20200418120000","amenities":"浴池,普通停车场/充电停车场","full_room":false,"location":{"lat":36.083078,"lon":120.37566},"praise":10}
id = 1
fields = {}
index = hotel
score = 1.0
{"took": 2,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": {"value": 2,"relation": "eq"},"max_score": 1.0,"hits": [{"_index": "hotel","_type": "_doc","_id": "2","_score": 1.0,"_source": {"title": "金都嘉怡假日酒店","city": "北京","price": 337,"create_time": "20210315200000","amenities": "wifi,充电停车场/可升降停车场","full_room": false,"location": {"lat": 39.915153,"lon": 116.403},"praise": 60}},{"_index": "hotel","_type": "_doc","_id": "1","_score": 1.0,"_source": {"title": "文雅酒店","city": "青岛","price": 556,"create_time": "20200418120000","amenities": "浴池,普通停车场/充电停车场","full_room": false,"location": {"lat": 36.083078,"lon": 120.37566},"praise": 10}}]}
}
答:_score 字段表示匹配文档的相关度得分,分数越高表示匹配度越高。
答:highlight 字段表示匹配文档中被高亮显示的字段及其高亮显示的内容。
答:可以通过 hits.total.value 字段获取匹配的文档总数。
答:可以通过 hits.hits 字段获取匹配的文档列表。
答:可以通过 hits.hits._source 字段获取匹配文档的原始数据。
答:可以通过 hits.hits.highlight 字段获取匹配文档的高亮显示信息。
答:_shards 字段表示搜索涉及的分片信息,包括总分片数、成功的分片数、跳过的分片数和失败的分片数。
答:took 字段表示搜索耗时,单位为毫秒。