面试题答案
一键面试1. 产品基本信息
- 字符串类型:对于产品名称、品牌等字符串字段,若需要进行全文搜索,可设置为
text
类型,并指定合适的分词器,如ik_max_word
(针对中文)。例如:
{
"product_name": {
"type": "text",
"analyzer": "ik_max_word"
}
}
若仅用于精确匹配(如产品编号),则设置为 keyword
类型:
{
"product_id": {
"type": "keyword"
}
}
- 数字类型:根据数值范围选择合适的数字类型,如
integer
(适用于一般整数)、long
(大整数)、float
(小数)等。例如产品价格可设置为float
:
{
"price": {
"type": "float"
}
}
2. 产品评论
- 文本类型:评论内容通常是长文本,设置为
text
类型,并选择合适的分词器进行全文搜索,方便用户搜索特定评论内容:
{
"review_content": {
"type": "text",
"analyzer": "ik_max_word"
}
}
- 点赞数:点赞数为数值,可设置为
integer
类型,便于进行聚合分析,如统计点赞数最多的产品评论:
{
"like_count": {
"type": "integer"
}
}
3. 评论人信息
- 对象嵌套类型:评论人信息可能包含姓名、年龄、地址等多个字段,将其定义为
object
类型。如果评论人信息需要独立进行搜索和聚合分析(例如按评论人所在地区统计评论数量),则使用nested
类型。以nested
类型为例:
{
"reviewer": {
"type": "nested",
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
},
"age": {
"type": "integer"
},
"address": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
4. 聚合分析考虑
- 字符串字段:
text
类型字段不适合直接用于聚合,因为分词后会丢失原词的完整性。而keyword
类型适合用于聚合分析,如按品牌统计产品数量。 - 数字字段:数字类型字段非常适合聚合分析,如计算产品价格的平均值、评论点赞数的总和等。
- 嵌套对象:对于
nested
类型对象,在进行聚合分析时,需要使用nested
聚合语法,以确保每个嵌套文档被独立处理,避免数据错误。例如,统计不同地区评论人的评论数量:
{
"aggs": {
"reviewers_by_address": {
"nested": {
"path": "reviewer"
},
"aggs": {
"address_buckets": {
"terms": {
"field": "reviewer.address.keyword"
}
}
}
}
}
}
通过这样设计 ElasticSearch 的映射数据类型,可以在高效存储的同时,满足各种搜索和聚合分析的需求。