ホームページ  >  記事  >  Java  >  SpringBoot が ES 解析の検索戻りフィールドを統合する問題を解決する方法

SpringBoot が ES 解析の検索戻りフィールドを統合する問題を解決する方法

PHPz
PHPz転載
2023-05-16 08:13:071294ブラウズ

    1. データ構造

    2 つのドキュメントをホテル インデックスにインデックス付けします:

    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 検索結果フィールドの解析

    1. 検索リクエストにかかったミリ秒数

    took 値は、実行することを示します。全体 検索リクエストにかかった時間 (ミリ秒)。

    2. shards クエリの参加シャードの総数

    _shards 部分は、クエリに参加しているシャードの総数と、これらのシャードでの失敗の数を示します。いくつ成功しました。通常、シャーディングが失敗することは望ましくありませんが、シャーディングの失敗は発生する可能性があります。同じシャードの元のデータとレプリカが失われるという壊滅的な障害が発生した場合、そのシャードで検索リクエストに応答できるレプリカは存在しなくなります。その場合、Elasticsearch はこのシャードを失敗として報告しますが、残りのシャードの結果は引き続き返します。

    3. timed_out クエリのタイムアウト

    timed_out この値は、クエリがタイムアウトしたかどうかを示します。デフォルトでは、検索リクエストはタイムアウトしません。

    4. ヒット数は検索結果を表します

    返された結果の最も重要な部分は hits で、これには、結果を表す total フィールドが含まれています。一致したドキュメントの合計、およびクエリ結果の上位 10 件のドキュメントを含む hits 配列。検索結果を解析するときは、通常、次のフィールドに注意する必要があります。

    hits.total.value: 一致するドキュメントの総数。
    hits.max_score: クエリに一致するドキュメントの _score の最大値。
    hits.hits: 一致するドキュメントのリスト。
    hits.hits._source: 一致するドキュメントの元のデータ。
    hits.hits._score: 一致するドキュメントのスコア。ドキュメントがクエリにどの程度一致するかを測定します。デフォルトでは、最も関連性の高いドキュメントの結果が最初に返されます。つまり、返されたドキュメントはスコアの降順に並べ替えられます。
    hits.hits.highlight: 一致するドキュメントの情報を強調表示します。

    4. SpringBoot は ElasticSearch を統合して検索結果を取得します

    @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);
    
            // 搜索结果
            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:匹配的文档的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);
    
            // 搜索结果
            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:匹配的文档的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 検索結果に対するインタビューの質問

    1. ElasticSearch 検索結果の _score フィールドとは何ですか平均?

    回答: _score フィールドは、一致する文書の関連性スコアを示し、スコアが高いほど一致度が高くなります。

    2. ElasticSearch の検索結果のハイライト フィールドは何を意味しますか?

    回答: ハイライト フィールドは、一致するドキュメント内のハイライトされたフィールドとそのハイライトされたコンテンツを表します。

    3. ElasticSearch の検索結果内のドキュメントの総数を取得するにはどうすればよいですか?

    回答: 一致するドキュメントの合計数は、hits.total.value フィールドから取得できます。

    4. ElasticSearch の検索結果で一致するドキュメントのリストを取得するにはどうすればよいですか?

    回答: 一致するドキュメントのリストは、hits.hits フィールドから取得できます。

    5. ElasticSearch の検索結果で一致するドキュメントの元データを取得するにはどうすればよいですか?

    回答: 一致するドキュメントの元のデータは、hits.hits._source フィールドを通じて取得できます。

    6. ElasticSearch の検索結果で一致するドキュメントのハイライト情報を取得するにはどうすればよいですか?

    回答: 一致するドキュメントのハイライト情報は、hits.hits.highlight フィールドを通じて取得できます。

    7. ElasticSearch の検索結果の _shards フィールドは何を意味しますか?

    回答: _shards フィールドは、シャードの総数、成功したシャードの数、スキップされたシャードの数、失敗したシャードの数など、検索に関係するシャード情報を表します。

    8. ElasticSearch の検索結果の Takeed フィールドは何を意味しますか?

    回答: 取得フィールドは、検索時間をミリ秒単位で示します。

    以上がSpringBoot が ES 解析の検索戻りフィールドを統合する問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。