溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SpringBoot如何整合ES解析搜索返回字段問題

發(fā)布時間:2023-05-18 13:58:04 來源:億速云 閱讀:108 作者:zzz 欄目:編程語言

這篇文章主要講解了“SpringBoot如何整合ES解析搜索返回字段問題”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“SpringBoot如何整合ES解析搜索返回字段問題”吧!

    1. 數(shù)據(jù)構(gòu)造

    索引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
    }
    
    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
    }

    2. ElasticSearch 查詢集群中所有索引中的所有文檔

     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
            }
          }
        ]
      }
    }

    3. ElasticSearch 搜索結(jié)果字段解析

    1. took 搜索請求耗費了多少毫秒

    took 值告訴我們執(zhí)行整個搜索請求耗費了多少毫秒。

    2. shards 查詢中參與分片的總數(shù)

    _shards 部分告訴我們在查詢中參與分片的總數(shù),以及這些分片成功了多少個失敗了多少個。正常情況下我們不希望分片失敗,但是分片失敗是可能發(fā)生的。如果我們遭遇到一種災難級別的故障,在這個故障中丟失了相同分片的原始數(shù)據(jù)和副本,那么對這個分片將沒有可用副本來對搜索請求作出響應(yīng)。假若這樣,Elasticsearch 將報告這個分片是失敗的,但是會繼續(xù)返回剩余分片的結(jié)果。

    3. timed_out 查詢是否超時

    timed_out 值告訴我們查詢是否超時。默認情況下,搜索請求不會超時。

    4. hits 表示搜索結(jié)果

    返回結(jié)果中最重要的部分是 hits ,它包含 total 字段來表示匹配到的文檔總數(shù),并且一個 hits 數(shù)組包含所查詢結(jié)果的前十個文檔。在解析搜索結(jié)果時,我們通常需要關(guān)注以下幾個字段:

    hits.total.value:匹配的文檔總數(shù)。
    hits.max_score:與查詢所匹配文檔的_score的最大值。
    hits.hits:匹配的文檔列表。
    hits.hits._source:匹配的文檔的原始數(shù)據(jù)。
    hits.hits._score:匹配的文檔的分數(shù)。它衡量了文檔與查詢的匹配程度,默認情況下,首先返回最相關(guān)的文檔結(jié)果,就是說,返回的文檔是按照score 降序排列的。
    hits.hits.highlight:匹配的文檔的高亮顯示信息。

    4. SpringBoot 整合ElasticSearch獲取搜索結(jié)果

    @Slf4j
    @Service
    public class ElasticSearchImpl {
    
        @Autowired
        private 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);
    
            // 搜索結(jié)果
            SearchHits searchHits = searchResponse.getHits();
    
            // hits.total.value:匹配的文檔總數(shù)
            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:匹配的文檔的原始數(shù)據(jù)
                String sourceAsString = hit.getSourceAsString();
                System.out.println("sourceAsString = " + sourceAsString);
    
                //  hits.hits._id:匹配的文檔的id
                String id = hit.getId();
                System.out.println("id = " + id);
    
                Map<String, DocumentField> 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);
    
        }
    }
    
    @Slf4j
    @Service
    public class ElasticSearchImpl {
    
        @Autowired
        private 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);
    
            // 搜索結(jié)果
            SearchHits searchHits = searchResponse.getHits();
    
            // hits.total.value:匹配的文檔總數(shù)
            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:匹配的文檔的原始數(shù)據(jù)
                String sourceAsString = hit.getSourceAsString();
                System.out.println("sourceAsString = " + sourceAsString);
    
                //  hits.hits._id:匹配的文檔的id
                String id = hit.getId();
                System.out.println("id = " + id);
    
                Map<String, DocumentField> 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.0
    
    sourceAsString = {"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.0
    
    sourceAsString = {"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
                    }
                }
            ]
        }
    }

    5 .ElasticSearch 搜索結(jié)果的面試題

    1. ElasticSearch 搜索結(jié)果中的 _score 字段是什么意思?

    答:_score 字段表示匹配文檔的相關(guān)度得分,分數(shù)越高表示匹配度越高。

    2. ElasticSearch 搜索結(jié)果中的 highlight 字段是什么意思?

    答:highlight 字段表示匹配文檔中被高亮顯示的字段及其高亮顯示的內(nèi)容。

    3. 如何獲取 ElasticSearch 搜索結(jié)果中的總文檔數(shù)?

    答:可以通過 hits.total.value 字段獲取匹配的文檔總數(shù)。

    4. 如何獲取 ElasticSearch 搜索結(jié)果中的匹配文檔列表?

    答:可以通過 hits.hits 字段獲取匹配的文檔列表。

    5. 如何獲取 ElasticSearch 搜索結(jié)果中匹配文檔的原始數(shù)據(jù)?

    答:可以通過 hits.hits._source 字段獲取匹配文檔的原始數(shù)據(jù)。

    6. 如何獲取 ElasticSearch 搜索結(jié)果中匹配文檔的高亮顯示信息?

    答:可以通過 hits.hits.highlight 字段獲取匹配文檔的高亮顯示信息。

    7. ElasticSearch 搜索結(jié)果中的 _shards 字段是什么意思?

    答:_shards 字段表示搜索涉及的分片信息,包括總分片數(shù)、成功的分片數(shù)、跳過的分片數(shù)和失敗的分片數(shù)。

    8. ElasticSearch 搜索結(jié)果中的 took 字段是什么意思?

    答:took 字段表示搜索耗時,單位為毫秒。

    感謝各位的閱讀,以上就是“SpringBoot如何整合ES解析搜索返回字段問題”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對SpringBoot如何整合ES解析搜索返回字段問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI