概述
众所周知,Elasticsearch作为搜索引擎被广泛应用在各个领域, 索引作为Elasticsearch搜索实现核心之一,Elasticsearch底层使用倒排索引对分词进行文档映射,默认使用大数据常用的相似推荐算法(TF-IDF)进行打分,既实现文档高效检索,又完成文档评分排序。在上一篇构建搜索系统之查询-实战基础上,本章将说明如何定义索引,并实现完整检索客户端。
1.索引定义
下面以实战商品搜索为例,说明复杂的商品索引定义,常用关键点如下:
- 分片和副本:定义索引分片数和副本数;
- 分词器:analyzer,如果搜索中文,可自定义索引字段的分词器;
- 标准化:normalizer,对字段标准化统一处理;
- 嵌套: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.构建搜索系统客户端-实战所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复