Magento2.4.2+Elasticsearch7.10.2前端搜索结果排序异常问题
问题描述
使用的版本:Magento 2.4.2 + Elasticsearch 7.10.2
问题现象:Elasticsearch后端返回的搜索结果排序正确,但前端展示的结果排序错误。
测试详情
本次示例搜索的西班牙语关键词lapices de colores意为“彩色铅笔”。
直接查询Elasticsearch的结果
执行curl命令:
curl 'localhost:9200/store_product_1_v118/_search?pretty&q=lapices+de+colores'
返回的第一条命中结果如下:
"hits" : [ { "_index" : "store_product_1_v118", "_type" : "document", "_id" : "9323", "_score" : 13.052037, "_source" : { "store_id" : "1", "sku" : "PEL800049", "status" : 1, "status_value" : "Habilitado", "visibility" : 4, "tax_class_id" : 2, "tax_class_id_value" : "Taxable Goods", "name" : "lapices de colores pastel pelikan x12", "url_key" : "lapices-de-colores-pastel-pelikan-x12", "category_ids" : [ 2, 135, 139, 214, 452 ], "position_category_2" : "10000", "name_category_2" : "RA▒~MZ ", "position_category_135" : "0", "name_category_135" : "ESCOLAR", "position_category_139" : "0", "name_category_139" : "LAPICES DE COLORES", "position_category_214" : "0", "name_category_214" : "LIBRERIA ", "position_category_452" : "0", "name_category_452" : "▒~ZTILES ESCOLARES Y KITS", "price_0_1" : "570.000000", "price_1_1" : "570.000000", "price_2_1" : "570.000000", "price_3_1" : "570.000000" ....
前端搜索结果
前端搜索URL:
https://store24.com.ar/catalogsearch/result/?q=lapices+de+colores
返回结果和ES直接查询结果排序不一致,错误截图如下:
已检查的配置
后台配置:商店 → 目录 → 目录 → "Product Listing Sort By" 设置为Position。
当前模板sorter.phtml代码如下:
<div class="toolbar-sorter sorter"> <label class="sorter-label" for="sorter"><?php /* @escapeNotVerified */ echo __('Sort by') ?></label> <select id="sorter" data-role="sorter" class="sorter-options"> <?php foreach ($block->getAvailableOrders() as $_key => $_order): ?> <option value="<?php /* @escapeNotVerified */ echo $_key; ?>" <?php if ($block->isOrderCurrent($_key)): ?> selected="selected" <?php endif; ?> > <?php echo $block->escapeHtml(__($_order)) ?> </option> <?php endforeach; ?> </select> <?php if ($block->getCurrentDirection() == 'desc'): ?> <a title="<?php /* @escapeNotVerified */ echo __('Set Ascending Direction') ?>" href="#" class="action sorter-action sort-desc" data-role="direction-switcher" data-value="asc"> <span><?php /* @escapeNotVerified */ echo __('Set Ascending Direction') ?></span> </a> <?php else: ?> <a title="<?php /* @escapeNotVerified */ echo __('Set Descending Direction') ?>" href="#" class="action sorter-action sort-asc" data-role="direction-switcher" data-value="desc"> <span><?php /* @escapeNotVerified */ echo __('Set Descending Direction') ?></span> </a> <?php endif; ?> </div>
解决思路
- 首先排查默认排序规则配置:你当前设置的Product Listing Sort By为Position,这个配置同时作用于分类列表页和搜索结果页。而ES直接返回的结果是按匹配分数
_score降序的相关性排序,Position是商品在对应分类中的排序值,和搜索匹配度无关,这是排序不一致的最常见原因。修复方法:进入后台「商店 → 配置 → 目录 → 目录搜索」,找到「Search Result Sort By」选项,选择「相关性」保存,清除缓存后重试即可。 - 若上述配置修改后不生效,检查是否有第三方扩展覆写了搜索逻辑:部分搜索、排序类扩展会强制将搜索结果按销量、库存、价格等字段排序,覆盖原生的相关性排序。可以临时切换到Magento原生Luma主题测试,如果原生主题下排序正常,问题就出在当前自定义主题或者依赖的扩展上。
- 验证Magento实际发送给ES的请求参数:你之前直接调用ES的请求是简单查询,而Magento调用ES时会附加排序、过滤等参数。你可以开启ES查询日志确认实际请求的排序规则,在
app/etc/env.php中添加如下配置:
'log' => [ 'elasticsearch' => [ 'active' => true, 'file' => 'var/log/elasticsearch.log' ] ]
保存后执行搜索,查看日志中的请求体,如果sort字段不是按_score降序,就说明Magento层修改了排序规则。
- sorter.phtml排查:你贴出的sorter.phtml是原生逻辑,本身没有问题。你可以在前端搜索结果页查看排序下拉框的默认选中值,如果默认选中的是Position而非相关性,就可以确认是配置问题。如果下拉框中没有「相关性」选项,说明主题或扩展移除了该排序项,可以在sorter.phtml的循环前打印
$block->getAvailableOrders()的返回值,确认是否包含relevance选项,再排查移除该选项的逻辑即可。
内容的提问来源于stack exchange,提问作者Typo
相关产品推荐
相关产品推荐

