129、商城业务-商品上架-nested数据类型场景

本文详细介绍了如何使用Elasticsearch设计商品索引,包括属性类型选择、嵌套字段应用及搜索优化策略,旨在解决数据扁平化处理中遇到的问题。
PUT product
{
  "mappings": {
    "properties": {
      "skuId": {
        "type": "long"
      },
      "spuId": {
        "type": "keyword"
      },
      "skuTitle": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "skuPrice": {
        "type": "keyword"
      },
      "skuImg": {
        "type": "keyword",
        "index": false,
        "doc_values": false
      },
      "saleCount": {
        "type": "long"
      },
      "hasStock": {
        "type": "boolean"
      },
      "hotScore": {
        "type": "long"
      },
      "brandId": {
        "type": "long"
      },
      "catalogId": {
        "type": "long"
      },
      "brandName": {
        "type": "keyword",
        "index": false,
        "doc_values": false
      },
      "brandImg": {
        "type": "keyword",
        "index": false,
        "doc_values": false
      },
      "catalogName": {
        "type": "keyword",
        "index": false,
        "doc_values": false
      },
      "attrs": {
        "type": "nested",
        "properties": {
          "attrId": {
            "type": "long"
          },
          "attrName": {
            "type": "keyword",
            "index": false,
            "doc_values": false
          },
          "attrValue": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

https://www.elastic.co/guide/en/elasticsearch/reference/7.9/nested.html  

PUT my-index-000001/_doc/1
{
  "group" : "fans",
  "user" : [ 
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}

GET my-index-000001/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "user.first": "Alice" }},
        { "match": { "user.last":  "Smith" }}
      ]
    }
  }
}

是text的,不是嵌入式的

 

这样就处理里数据扁平化处理的错误

 

 

 

 

 

 

 

 

 

 

 

 

 

**高校专业实习管理平台设计与实现** 本设计项目旨在构建一个服务于高等院校专业实习环节的综合性管理平台。该系统采用当前主流的Web开发架构,基于Python编程语言,结合Django后端框架与Vue.js前端框架进行开发,实现了前后端逻辑的分离。数据存储层选用广泛应用的MySQL关系型数据库,确保了系统的稳定性和数据处理的效率。 平台设计了多角色协同工作的管理模型,具体包括系统管理员、院系负责人、指导教师、实习单位对接人以及参与实习的学生。各角色依据权限访问不同的功能模块,共同构成完整的实习管理流程。核心功能模块涵盖:基础信息管理(如院系、专业、人员信息)、实习过程管理(包括实习公告发布、实习内容规划、实习申请与安排)、双向反馈机制(单位评价与学生反馈)、实习支持与保障、以及贯穿始终的成绩评定与综合成绩管理。 在技术实现层面,后端服务依托Django框架的高效与安全性构建业务逻辑;前端界面则利用Vue.js的组件化特性与LayUI的样式库,致力于提供清晰、友好的用户交互体验。数据库设计充分考虑了实习管理业务的实体关系与数据一致性要求,并保留了未来功能扩展的灵活性。 整个系统遵循规范的软件开发流程,从需求分析、系统设计、编码实现到测试验证,均进行了多轮迭代与优化,力求在功能完备性、系统性能及用户使用体验方面达到较高标准。 **核心术语**:实习管理平台;Django框架;MySQL数据库;Vue.js前端;Python语言。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
在电磁散射与雷达技术的研究中,涉及粗糙表面电磁特性模拟的核心概念包括统计参数化建模方法、不同电场矢量方向的极化模式、特定方向的能量反射现象、理想化波前模型以及具有随机起伏特征的界面。以下是对这些要点的系统阐述: 统计参数化建模是一种基于表面统计特征描述其不规则性的电磁散射计算方法,尤其适用于均方根高度较小的粗糙界面在微波至毫米波频段的散射特性分析。 水平极化与垂直极化分别指电场矢量平行于地面和垂直于地面的振动状态。在雷达探测中,采用不同的极化模式有助于提升目标辨识度并抑制环境干扰。 当电磁波与物体相互作用时,部分能量沿接近入射方向返回,这种现象称为反向散射。其在雷达系统的探测灵敏度与目标特征分析中具有关键作用。 平面波是在均匀介质中传播的理想波型,其电场与磁场分布保持一致的相位关系,常作为理论简化模型用于电磁问题的解析与数值计算。 粗糙界面指具有随机起伏特征的表面,其不规则程度可通过均方根高度进行量化。这种结构特性会改变电磁波的传播路径与能量分布,进而影响信号的接收与处理。 相关压缩文件可能包含了实现上述建模方法的程序代码,通常采用数值计算语言编写,用于模拟不同极化状态下粗糙表面对平面波的反向散射响应。通过此类仿真,能够预测各类场景下的散射参数,为雷达系统设计与遥感数据解译提供理论依据。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<think>好的,我现在要解决用户的问题:如何在Elasticsearch中将nested数据类型与FunctionScoreQuery.ScoreMode.SUM结合使用。首先,我需要回顾一下用户提供的引用资料和他们之前的问题。 用户之前询问了关于FunctionScoreQueryBuilder的ScoreMode.SUM的使用,现在他们想了解如何将其与nested数据类型结合。引用中提到了nested类型的定义、索引创建、查询和聚合,特别是引用[3]和[4]中的nested查询示例。用户需要具体的结合示例,可能是在nested字段上应用多个评分函数,并使用SUM模式合并结果。 首先,我需要确认nested数据类型的特点。根据引用[1],nested类型用于处理对象数组,避免扁平化导致的数据关联问题。这意味着在查询时需要使用nested查询来访问内部字段。引用[4]中的示例展示了如何编写nested查询,使用path指定嵌套对象的路径,并在query中定义查询条件。 接下来,FunctionScoreQuery的ScoreMode.SUM用于将多个评分函数的分数相加。用户希望将这种评分模式应用到nested字段上。可能的场景是对嵌套文档中的多个字段进行评分,然后将这些评分相加,影响主文档的相关性得分。 我需要考虑如何将nested查询与function score结合。例如,用户可能有一个产品索引,每个产品有多个评论(嵌套类型),需要根据评论中的评分和关键词匹配来提升主文档的得分。这时候,可以使用FunctionScoreQuery中的多个评分函数,每个函数针对嵌套字段的不同条件,并使用SUM模式合并这些评分。 需要验证以下几点: 1. 如何在function score中正确引用nested字段的路径。 2. 确保每个评分函数都正确应用在嵌套文档的条件上。 3. 使用ScoreMode.SUM正确累加多个函数的评分。 4. 可能的boost_mode设置,比如将函数评分与原始评分相乘。 可能需要参考Elasticsearch的官方文档,确认nested查询在function score中的写法。同时,注意在Java API中构建查询时,如何嵌套使用FunctionScoreQueryBuilder和NestedQueryBuilder。 另外,用户提供的引用[3]中的示例展示了nested字段的映射和查询结构,可以作为构建示例的基础。结合引用[2]中的聚合查询,可能需要考虑如何将评分函数与聚合结果结合,但用户当前问题更关注评分而非聚合,所以应聚焦于查询部分。 还需要考虑可能的错误点,例如路径是否正确,过滤器是否准确匹配嵌套文档的条件,以及评分函数是否正确应用。例如,在嵌套查询中使用field_value_factor时,需要确保字段存在于嵌套文档中,并且路径正确。 最后,需要生成一个完整的示例,包括索引映射、查询DSL和Java代码,确保用户能够理解如何在实际项目中应用这些配置。同时,回答中需要引用用户提供的引用资料,如引用[1]和[4],以增强可信度。</think>### Elasticsearch中Nested数据类型与`FunctionScoreQuery.ScoreMode.SUM`结合使用示例 --- #### 1. **场景说明** 假设有一个商品索引,每个商品包含嵌套的评论数据(`reviews`字段,类型为`nested`)。需实现以下需求: - 基础查询:匹配商品名称中的关键词(例如“手机”)。 - 评分函数叠加: - 函数1:评论中包含“续航好”且评分≥4的评论,每条匹配评论提升权重2。 - 函数2:评论中“拍照”关键词的匹配数量,每匹配一次提升权重1。 - 总评分:将两个函数的评分结果**累加(SUM)**,并与原始查询评分相乘。 --- #### 2. **索引映射(Mapping)** 首先定义包含`nested`类型的映射(参考引用[1][^1]和引用[2][^2]): ```json PUT /products { "mappings": { "properties": { "name": { "type": "text" }, "reviews": { "type": "nested", "properties": { "comment": { "type": "text" }, "rating": { "type": "integer" }, "keywords": { "type": "keyword" } } } } } } ``` --- #### 3. **DSL 查询示例** 结合`function_score`和`nested`查询(参考引用[4][^4]): ```json { "query": { "function_score": { "query": { "match": { "name": "手机" } }, "functions": [ { "filter": { "nested": { "path": "reviews", "query": { "bool": { "must": [ { "match": { "reviews.comment": "续航好" } }, { "range": { "reviews.rating": { "gte": 4 } } } ] } } } }, "weight": 2 }, { "filter": { "nested": { "path": "reviews", "query": { "term": { "reviews.keywords": "拍照" } } } }, "weight": 1 } ], "score_mode": "sum", // 函数评分累加 "boost_mode": "multiply" // 总评分=原始评分×总函数评分 } } } ``` --- #### 4. **Java API 实现** 使用Elasticsearch Java客户端构建查询(参考引用[3][^3]结构): ```java import org.elasticsearch.index.query.*; import org.elasticsearch.common.lucene.search.function.*; // 主查询:匹配商品名称 QueryBuilder mainQuery = QueryBuilders.matchQuery("name", "手机"); // 函数1:评论包含“续航好”且评分≥4 QueryBuilder function1Filter = QueryBuilders.nestedQuery( "reviews", QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("reviews.comment", "续航好")) .must(QueryBuilders.rangeQuery("reviews.rating").gte(4)), ScoreMode.None ); FunctionScoreQueryBuilder.FilterFunctionBuilder function1 = new FilterFunctionBuilder(function1Filter, ScoreFunctionBuilders.weightFactorFunction(2.0f)); // 函数2:评论关键词包含“拍照” QueryBuilder function2Filter = QueryBuilders.nestedQuery( "reviews", QueryBuilders.termQuery("reviews.keywords", "拍照"), ScoreMode.None ); FunctionScoreQueryBuilder.FilterFunctionBuilder function2 = new FilterFunctionBuilder(function2Filter, ScoreFunctionBuilders.weightFactorFunction(1.0f)); // 构建FunctionScoreQuery FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery( mainQuery, new FilterFunctionBuilder[] { function1, function2 } ) .scoreMode(FunctionScoreQuery.ScoreMode.SUM) // 评分累加 .boostMode(CombineFunction.MULTIPLY); // 执行查询 SearchResponse response = client.prepareSearch("products") .setQuery(functionScoreQuery) .get(); ``` --- #### 5. **结果解析** 假设文档结构如下: ```json { "name": "旗舰手机", "reviews": [ { "comment": "续航好,但拍照一般", "rating": 4, "keywords": ["续航"] }, { "comment": "拍照效果惊艳", "rating": 5, "keywords": ["拍照"] } ] } ``` - **函数1评分**:匹配第一条评论(评分≥4且含“续航好”),权重=2。 - **函数2评分**:匹配第二条评论(含“拍照”),权重=1。 - **总函数评分** = 2 + 1 = 3。 - 最终文档评分 = 原始评分(来自`name:手机`的匹配)× 3。 --- ### 关键点总结 | 技术点 | 说明 | |--------|------| | **Nested过滤** | 使用`nested`查询确保过滤条件作用在嵌套文档上[^4] | | **函数叠加** | `score_mode: sum`确保多个函数的权重值相加[^1] | | **评分隔离** | 每个`nested`函数仅影响匹配的嵌套文档,主文档评分独立计算 | | **性能优化** | 尽量限制嵌套查询的深度,避免复杂嵌套导致性能下降[^3] | --- ### 常见问题 **Q1: 如果嵌套文档中多个子文档匹配函数条件,权重会重复累加吗?** - **答**:不会。每个函数权重仅匹配一次,无论嵌套文档中有多少符合条件的子文档。例如,若函数1的`weight=2`,即使有3条评论满足条件,该函数评分仍为2。 **Q2: 如何对嵌套字段进行动态权重计算(如根据评分值动态加权)?** - **答**:使用`field_value_factor`函数代替`weight`,例如: ```json { "filter": { ... }, "field_value_factor": { "field": "reviews.rating", "modifier": "log1p" } } ``` --- ### 引用 : Elasticsearch 数据建模中关于`nested`类型的扁平化处理说明。 [^2]: `nested`类型的索引定义示例。 [^3]: `nested`字段的映射和查询结构参考。 [^4]: `nested`查询的基础语法和路径定义。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值