You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solr MoreLikeThis电商场景:PDP页面能否运行时生成查询并过滤结果?

在Java环境中为Solr MoreLikeThis结果添加动态过滤条件

完全可以在用户进入PDP页面时,根据场景动态生成查询并对MoreLikeThis(MLT)结果集应用过滤。下面结合Java环境(SolrJ客户端)给出两种实用方案:

方案1:Solr查询阶段直接附加动态过滤(推荐)

Solr的MLT查询本身支持通过fq(Filter Query)参数添加过滤条件,你可以根据当前场景(如"相似颜色""同品牌")动态构造过滤规则,和MLT参数一起发送给Solr,让Solr端直接返回过滤后的结果,性能更优。

示例代码:

// 初始化Solr客户端(根据你的实际配置调整)
SolrClient solrClient = new HttpSolrClient.Builder("http://your-solr-host:8983/solr/your-product-collection").build();
SolrQuery mltQuery = new SolrQuery();

// 基础MLT配置:指定目标商品ID,开启MLT功能
mltQuery.set("q", "id:" + targetProductId);
mltQuery.set("mlt", true);
mltQuery.set("mlt.fl", "product_name,description,category"); // 定义计算相似性的核心字段

// 动态生成过滤条件(根据当前页面场景切换)
String currentScene = getCurrentScene(); // 比如从请求参数或页面配置获取场景标识
if ("similar_color".equals(currentScene)) {
    // 先获取目标商品的颜色属性(可提前缓存避免重复查询)
    QueryResponse targetResp = solrClient.query(new SolrQuery("id:" + targetProductId).setFields("color"));
    String targetColor = targetResp.getResults().get(0).getFieldValue("color").toString();
    // 添加颜色过滤规则
    mltQuery.addFilterQuery("color:" + targetColor);
} else if ("same_brand".equals(currentScene)) {
    // 同品牌过滤逻辑
    QueryResponse targetResp = solrClient.query(new SolrQuery("id:" + targetProductId).setFields("brand"));
    String targetBrand = targetResp.getResults().get(0).getFieldValue("brand").toString();
    mltQuery.addFilterQuery("brand:" + targetBrand);
} else if ("same_type".equals(currentScene)) {
    // 同商品类型过滤逻辑
    QueryResponse targetResp = solrClient.query(new SolrQuery("id:" + targetProductId).setFields("product_type"));
    String targetType = targetResp.getResults().get(0).getFieldValue("product_type").toString();
    mltQuery.addFilterQuery("product_type:" + targetType);
}

// 执行查询,直接拿到过滤后的相似商品
QueryResponse response = solrClient.query(mltQuery);
SolrDocumentList filteredSimilarProducts = response.getResults();

方案2:Java端对MLT结果二次过滤

如果你的过滤逻辑涉及复杂业务规则(比如结合用户行为、库存状态等非Solr字段的规则),可以先获取完整的MLT结果集,再在Java代码中做二次过滤:

示例代码:

// 先获取未过滤的完整MLT结果
SolrQuery rawMltQuery = new SolrQuery();
rawMltQuery.set("q", "id:" + targetProductId);
rawMltQuery.set("mlt", true);
rawMltQuery.set("mlt.fl", "product_name,description,category");
QueryResponse rawResp = solrClient.query(rawMltQuery);
SolrDocumentList allSimilarProducts = rawResp.getResults();

// 动态过滤:比如只保留有库存的同类型商品
String targetType = getTargetProductType(targetProductId); // 自定义方法获取目标商品类型
List<SolrDocument> filteredProducts = allSimilarProducts.stream()
    .filter(doc -> targetType.equals(doc.getFieldValue("product_type")))
    .filter(doc -> Boolean.TRUE.equals(doc.getFieldValue("in_stock"))) // 库存校验
    .collect(Collectors.toList());

关键注意事项

  • 确保用于过滤的字段(如color、brand)在Solr Schema中配置为indexed="true"(支持查询过滤)和stored="true"(方便获取目标商品的属性值)。
  • 高频场景下建议缓存目标商品的核心属性(颜色、品牌等),避免每次都单独查询Solr,提升响应速度。
  • 可以通过mlt.mintermfreq、mlt.mindf等参数调整MLT的相似性计算逻辑,让初始结果更贴合业务,再配合过滤条件进一步精准筛选。

内容的提问来源于stack exchange,提问作者Jai Bhaarath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:50:43