プロジェクトでElasticsearchを使用する方法

序文

製品検索モジュールがプロジェクトに関与しています。ESの知識を学ぶことで、ESをプロジェクトに適用しようとしています。このブログでは、主にプロジェクトでESを使用する方法について説明します。一緒に購入したAlibabaCloudサーバーの有効期限が切れているため、ここでは説明しません。あなたは将来の仕事のために良いサーバーを購入しなければなりません

ESとKibanaもインストールしたい場合は、以前のブログに従ってポータルを構築でき
ます<----ここをクリックしてください

ESのデータのモデル

ESからのデータを確認したい場合は、まずESに保存する必要があります。その時、クラスメートと直接木花にインポートするように話し合ったのですが、面倒くさいので、クラスメートが書いたバックエンド管理には商品があると思いました。棚の機能、そしてここから始めます。

モデルデザイン

私たちが設計したモデルを見てください:

@Data
public class SkuEsModel {
    
    
	//具体商品的id
    private Long skuId;
	//某类商品的id 
    private Long spuId;
    //销售商品的标题
    private String skuTitle;
    //销售商品的价格
    private BigDecimal skuPrice;
    //销售商品的图片
    private String skuImg;
    //商品的销量
    private Long saleCount;
    //商品是否有库存
    private Boolean hasStock;
    //商品的评分
    private Long hotScore;
    //商品所属品牌的id
    private Long brandId;
    //商品所属分类的id
    private Long catalogId;
    //商品所属品牌的名字
    private String brandName;
    //商品所属品牌的图片
    private String brandImg;
    //商品所属分类的名字
    private String catalogName;
    //商品所对应的属性
    private List<Attrs> attrs;
    @Data
    public static class Attrs {
    
    
    	//属性id
        private Long attrId;
        //属性的名字
        private String attrName;
        //属性值
        private String attrValue;
    }
}

なぜこのように設計するのか

まず、モール内の企業がesを使用していることについて話しましょう。

  • モールホームページの3レベルリストの3レベルディレクトリから検索ページに入る
  • モールホームページの検索ボックスから検索したい商品名を入力し、esをチェックしてデータを返却してください。

クリックして第3レベルのディレクトリに入力すると、カテゴリIDパラメータが渡されるため、モデルに検索を提供するカテゴリIDが必要です。次に、検索ボックスから入力すると、sku製品のタイトルと一致する文字列パラメータが渡されます。
したがって、これらの検索を通じて、詳細ページにレンダリングするためにフロントエンドにどのようなデータを提供する必要がありますか?
ここに写真の説明を挿入
上のスクリーンショットはJD.comのものです。クラスメートはJDのページに基づいていくつかの機能を模倣しました。写真の注釈を読んだ後、モデルがそのように設計されている理由を理解する必要があります。ただし、製品の詳細ページに関連する他のフィールドがいくつかあります。まず、この検索ページについて説明しましょう。
検索ページでは、真ん中のこれらの属性やブランドは、検索ごとに異なる答えを出す必要があるため、esの集計操作で実現します。
ここで、さらに別の議論のトピックがあります。この情報は、集約によってどのように取得されるのでしょうか。
まず、明後日、管理者が棚をクリックすると、対応するskuIdとそれが属するspuの情報が表示されます。棚にある場合は、データベースで確認し、SkuModelで情報を検索してカプセル化し、リモートで検索サービスを呼び出します。これらのデータはesに保存されます。

ESへの入金方法

次に、esインデックスマッピングの設計を見てください。

PUT product
{
    
    
  "mappings": {
    
    
    "properties": {
    
    
      "skuId": {
    
    
        "type": "long"
      },
      "spuId": {
    
    
        "type": "long"
      },
      "skuTitle": {
    
    
        "type": "text",//支持全文搜索的
        "analyzer": "ik_smart"//采用ik分词器
      },
      "skuPrice": {
    
    
        "type": "keyword"//必须输入精确值才能搜索
      },
      "skuImg": {
    
    
        "type": "keyword",//必须输入精确值才能搜索
        "index": false,//不能被索引
        "doc_values": false
      },
      "saleCount": {
    
    
        "type": "long"
      },
      "hosStock": {
    
    
        "type": "boolean"
      },
      "hotScore": {
    
    
        "type": "long"
      },
      "brandId": {
    
    
        "type": "long"
      },
      "catelogId": {
    
    
        "type": "long"
      },
      "brandName": {
    
    
        "type": "keyword",
        "index": false,
        "doc_values": false
      },
      "brandImg": {
    
    
        "type": "keyword",
        "index": false,
        "doc_values": false
      },
      "catelogName": {
    
    
        "type": "keyword",
        "index": false,
        "doc_values": false
      },
      "attrs": {
    
    
        "type": "nested",//es的嵌套模型
        "properties": {
    
    
          "attrId": {
    
    
            "type": "long"
          },
          "attrName": {
    
    
            "type": "keyword",
            "index": false,
            "doc_values": false
          },
          "attrValue": {
    
    
            "type": "keyword"
          }
        }
      }
    }
  }
}

ES APIを操作します:Javaを介してRestHighLevelClientを操作して、ESの追加、削除、および変更を操作し、それを保存する方法を確認します

@Override
    public boolean productStatusUp(List<SkuEsModel> skuEsModels) throws IOException {
    
    

		//1.在es中建立索引,建立号映射关系
        //2. 在ES中保存这些数据
        BulkRequest bulkRequest = new BulkRequest();
        for (SkuEsModel skuEsModel : skuEsModels) {
    
    
            //构造保存请求
            IndexRequest indexRequest = new IndexRequest(EsConstant.PRODUCT_INDEX);
            indexRequest.id(skuEsModel.getSkuId().toString());
            String jsonString = JSON.toJSONString(skuEsModel);
            indexRequest.source(jsonString, XContentType.JSON);
            bulkRequest.add(indexRequest);
        }


        BulkResponse bulk = esRestClient.bulk(bulkRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);

        //TODO 如果批量错误
        boolean hasFailures = bulk.hasFailures();

        List<String> collect = Arrays.asList(bulk.getItems()).stream().map(item -> {
    
    
            return item.getId();
        }).collect(Collectors.toList());

        log.info("商品上架完成:{}",collect);

        return hasFailures;
    }

ESからのデータを確認する方法

パラメータをクエリし、これらのパラメータをカプセル化するモデルも設計しました

@Data
public class SearchParam {
    
    
    /**
     * 页面传递过来的全文匹配关键字
     */
    private String keyword;
    /**
     * 品牌id,可以多选
     */
    private List<Long> brandId;
    /**
     * 三级分类id
     */
    private Long catalog3Id;
    /**
     * 排序条件:sort=price/salecount/hotscore_desc/asc
     */
    private String sort;
    /**
     * 是否显示有货
     */
    private Integer hasStock;
    /**
     * 价格区间查询
     */
    private String skuPrice;
    /**
     * 按照属性进行筛选
     */
    private List<String> attrs;
    /**
     * 页码
     */
    private Integer pageNum = 1;
    /**
     * 原生的所有查询条件
     */
    private String _queryString;
}

これらのパラメータを使用して、esに移動し、アセンブリクエリに対応するインデックスを見つけて、クエリの手順を要約します。

  1. クエリに必要なDSLステートメントを動的に構築します
  2. 検索リクエストの準備:1ファジーマッチング、フィルタリング(属性、分類、ブランド、価格帯、在庫に応じて)、並べ替え、ページング、強調表示、集計分析2、集計:ブランド集計、分類集計、属性集計
  3. 検索要求を実行します
  4. 応答データを分析し、必要な形式にカプセル化します
  5. 戻る

おすすめ

転載: blog.csdn.net/MarkusZhang/article/details/108001353