我是靠谱客的博主 高大猎豹,最近开发中收集的这篇文章主要介绍【商城】Elasticsearch搜索引擎-02.构建搜索系统客户端-实战,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

众所周知,Elasticsearch作为搜索引擎被广泛应用在各个领域, 索引作为Elasticsearch搜索实现核心之一,Elasticsearch底层使用倒排索引对分词进行文档映射,默认使用大数据常用的相似推荐算法(TF-IDF)进行打分,既实现文档高效检索,又完成文档评分排序。在上一篇构建搜索系统之查询-实战基础上,本章将说明如何定义索引,并实现完整检索客户端。

1.索引定义

下面以实战商品搜索为例,说明复杂的商品索引定义,常用关键点如下:

  1. 分片和副本:定义索引分片数和副本数;
  2. 分词器:analyzer,如果搜索中文,可自定义索引字段的分词器;
  3. 标准化:normalizer,对字段标准化统一处理;
  4. 嵌套:Elasticsearch支持嵌套搜索,常用在商品优惠活动(子文档)与商品(主文档)一起搜索。
{
  "aliases": {
    "index_product": {}
  },
  "settings": {
    "index": {
      "number_of_shards": 5,
      "number_of_replicas": 1
    },
    "analysis": {
      "normalizer": {
        "lowercase": {
          "type": "custom",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings": {
    "index_product": {
      "_all": {
        "enabled": false
      },
      "dynamic_templates": [
        {
          "attribute_values": {
            "match_mapping_type": "*",
            "mapping": {
              "type": "keyword"
            }
          }
        }
      ],
      "properties": {
        "id": {
          "type": "long"
        },
        "spuId": {
          "type": "long"
        },
        "categoryId": {
          "type": "long"
        },
        "categoryIds": {
          "type": "long"
        },
        "productCode": {
          "type": "keyword"
        },
        "shopId": {
          "type": "long"
        },
        "shopName": {
          "type": "keyword"
        },
        "brandId": {
          "type": "long"
        },
        "brandName": {
          "type": "text",
          "analyzer": "keyword"
        },
        "name": {
          "type": "text",
          "analyzer": "ik_max_word"
        },
        "nameKw": {
          "type": "keyword",
          "normalizer": "lowercase"
        },
        "mainImage": {
          "type": "keyword",
          "index": false
        },
        "status": {
          "type": "integer"
        },
        "type": {
          "type": "integer"
        },
        "businessType": {
          "type": "integer"
        },
        "bitTag": {
          "type": "long",
          "index": false
        },
        "updatedAt": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss||epoch_millis"
        },
        "lowPrice": {
          "type": "long"
        },
        "highPrice": {
          "type": "long"
        },
        "keyword": {
          "type": "text",
          "analyzer": "ik_max_word"
        },
        "saleQuantity": {
          "type": "long"
        },
        "inStock": {
          "type": "integer"
        },
        "shopCategoryIds": {
          "type": "long"
        },
        "source": {
          "type": "integer"
        },
        "channelList": {
          "type": "long"
        },
        "integral": {
          "type": "long"
        },
        "version": {
          "type": "keyword"
        },
        "颜色": {
          "type": "keyword"
        },
        "尺寸": {
          "type": "keyword"
        },
        "长度": {
          "type": "keyword"
        },
        "priceJson": {
          "type": "keyword",
          "index": false
        },
        "activityObject": {
          "type": "nested",
          "properties": {
            "id": {
              "type": "long"
            },
            "code": {
              "type": "keyword"
            },
            "warmStartAt": {
              "type": "long"
            },
            "startAt": {
              "type": "long"
            },
            "expiredAt": {
              "type": "long"
            }
          }
        }
      }
    }
  }
}

2. 索引客户端

搜索客户端包括如下两部分核心内容;

  • 检索:查询转移,请求分发,请求结果处理,下载资源地址:搜索客户端-检索实现;
  • 定义:索引、聚合、查询,详细的实现可以参考:构建搜索系统之查询-实战,下载资源地址:搜索客户端-检索定义;

搜索索引客户端

索引客户端

2.1 调用接口封装

/**
 * Copyright (c) 2020-2088 LEE POSSIBLE All Rights Reserved
 * Project:product-center
 * Package:com.leepossible.search.client
 * Version 1.0
 * 搜索客户端接口定义
 * @author <a href="mailto:974064580@163.com>lee possible</a>
 * @date 2021-02-06 10:07
 */
public interface SearchClient {
    /**
     * 搜索
     * @param request 搜索请求
     * @param <T> 类型
     * @return
     */
    <T>SearchResult<T> search(SearchRequest request);

    /**
     * 批量搜索
     * @param request 搜索请求
     * @return
     */
    MSearchResult search(MSearchRequest request);

    /**
     * 批量索引文档
     * @param request 批量请求
     * @return
     */
    BulkResult bulk(BulkRequest request);

    /**
     * 判断索引或索引别名是否存在
     * @param index 索引或索引别名
     * @return
     */
    boolean exist(String index);

    /**
     * 创建索引结构
     * @param index 索引名
     * @param json 索引结构
     * @return
     */
    boolean setup(String index, String json);

    /**
     * 通过别名从已存在的索引中创建一份新的索引(别名切换)
     * @param alias 别名
     * @return 新的索引名
     */
    String createFrom(String alias);

    /**
     * 将别名切换到新的索引上(同时删除别名旧指向,新索引必须存在才能切换)
     * @param alias 别名
     * @param newIndex 新索引
     * @return 旧索引
     */
    String switchAlias(String alias, String newIndex);

    /**
     * 关闭索引,不允许读写操作
     * @param index 索引名
     * @return
     */
    boolean close(String index);

    /**
     * 获取原生客户端
     * @param <T> 类型
     * @return
     */
    <T> T getClient();
}

2.2 聚合

/**
 * Copyright (c) 2020-2088 LEE POSSIBLE All Rights Reserved
 * Project:product-center
 * Package:com.leepossible.search.client.builder
 * Version 1.0
 * Aggregate聚合Builder
 * @author <a href="mailto:974064580@163.com>lee possible</a>
 * @date 2021-02-06 17:00
 */
public final class AggregateBuilder {
    /**
     * terms聚合
     *
     * @param field field
     * @param size  size
     * @return
     */
    public static TermsAggregate terms(String field, Integer size) {
        TermsAggregate aggregate = new TermsAggregate();
        aggregate.setField(field);
        aggregate.setSize(size);
        return aggregate;
    }

    /**
     * 度量聚合min
     *
     * @param field field
     * @return
     */
    public static MetricAggregate min(String field) {
        return MetricAggregate.builder().field(field).mode(MetricMode.min).build();
    }

    /**
     * 度量聚合max
     *
     * @param field field
     * @return
     */
    public static MetricAggregate max(String field) {
        return MetricAggregate.builder().field(field).mode(MetricMode.max).build();
    }

    /**
     * 度量聚合avg
     *
     * @param field field
     * @return
     */
    public static MetricAggregate avg(String field) {
        return MetricAggregate.builder().field(field).mode(MetricMode.avg).build();
    }

    /**
     * 度量聚合sum
     *
     * @param field field
     * @return
     */
    public static MetricAggregate sum(String field) {
        return MetricAggregate.builder().field(field).mode(MetricMode.sum).build();
    }
}

2.3 排序

/**
 * Copyright (c) 2020-2088 LEE POSSIBLE All Rights Reserved
 * Project:product-center
 * Package:com.leepossible.search.client.builder
 * Version 1.0
 * 排序builder模式
 * @author <a href="mailto:974064580@163.com>lee possible</a>
 * @date 2021-02-06 16:53
 */
public final class SortBuilder {
    /**
     * 字段排序
     * @param field 字段
     * @param order 排序方向
     * @return
     */
    public static Sort build(String field, Order order){
        return Sort.builder().field(field).order(order).build();
    }

    /**
     * 脚本排序
     * @param script Script脚本
     * @param order 排序方向
     * @param type 排序类型
     * @return
     */
    public static Sort build(Script script, Order order, String type){
        return Sort.builder().script(script).order(order).type(type).build();
    }
}

最后

以上就是高大猎豹为你收集整理的【商城】Elasticsearch搜索引擎-02.构建搜索系统客户端-实战的全部内容,希望文章能够帮你解决【商城】Elasticsearch搜索引擎-02.构建搜索系统客户端-实战所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部