Clasificación personalizada en Elasticsearch

Hola amigos, bienvenidos nuevamente. En este blog, veremos cómo podemos personalizar la clasificación en Elasticsearch proporcionando clasificación en formato de matriz. Como sabemos, Elasticsearch proporciona búsqueda y análisis casi en tiempo real para todo tipo de datos. Ya sea que tenga texto estructurado o no estructurado, datos numéricos o datos geoespaciales, Elasticsearch puede almacenarlos e indexarlos de manera eficiente para admitir búsquedas rápidas. Una de las fortalezas clave de Elasticsearch radica en su escalabilidad y velocidad. Su naturaleza distribuida permite la escalabilidad horizontal, satisfaciendo perfectamente las crecientes necesidades de datos. Además, su capacidad de indexación casi en tiempo real garantiza que los datos estén disponibles para su búsqueda inmediatamente después de su ingesta. Elasticsearch también proporciona otras técnicas de clasificación de forma predeterminada. Sin embargo, la técnica de clasificación personalizada es una de mis favoritas y también tiene varios casos de uso. Para comenzar, primero necesitamos crear un módulo en el que escribimos nuestra funcionalidad. Después de crear el módulo, necesitamos crear un complemento para modificar la consulta de Elasticsearch. Para esto, primero definimos nuestro complemento en el archivo di.xml en la ruta app/code/VendorName/ModuleName/etc/di.xml Después de definir el complemento, debemos crear nuestro archivo de complemento en la ubicación definida en la definición del complemento.
[
«price_bucket» => []»categoría_depósito» =>
[
«buckets» => []

]]]; /** * Inicialización de dependencia * * @param Mapper $mapper * @param \Psr\Log\LoggerInterface $logger * @param ResponseFactory $responseFactory * @param ConnectionManager $connectionManager * @param AggregationBuilder $aggregationBuilder * @param QueryContainerFactory $queryContainerFactory * @ parámetro \Magento\Framework\Message\ManagerInterface $messageManager * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $collectionFactory */ función pública __construct( mapeador privado $mapper, privado \Psr\Log\LoggerInterface $logger, privado ResponseFactory $responseFactory, privado ConnectionManager $connectionManager, privado AggregationBuilder $aggregationBuilder, privado QueryContainerFactory $queryContainerFactory, \Magento\Framework\Message\ManagerInterface privado $messageManager, \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $collectionFactory ) { / * * * Agregue el producto del vendedor a la colección del vendedor * * @param \Magento\Framework\Search\AdapterInterface $subject * @param callable $proceed * @param RequestInterface $request */ public function aroundQuery( \Magento\Framework\Search \AdapterInterface $ objeto, invocable $proceder, RequestInterface $solicitud) { intentar { $productIds = $this->getProductCustomSortOrder(); $cliente = $this->connectionManager->getConnection(); $aggregationBuilder = $this->aggregationBuilder; $updatedQuery = $this->mapper->buildQuery($solicitud); no establecido ($ consulta actualizada[‘body’][‘query’][‘bool’][‘should’]); no establecido ($ consulta actualizada[‘body’][‘query’][‘bool’][‘minimum_should_match’]); no establecido ($ consulta actualizada[‘body’][‘sort’]); $ consulta actualizada[‘body’][‘sort’][0][‘_script’][‘type’] = ‘número’; $setSortOrderAttribute = ‘params.sortOrder.indexOf(doc[«_id»].valor)’; $ consulta actualizada[‘body’][‘sort’][0][‘_script’][‘script’][‘inline’] = $setSortOrderAttribute; $ consulta actualizada[‘body’][‘sort’][0][‘_script’][‘script’][‘params’][‘sortOrder’] = $IDproducto; no establecido ($ consulta actualizada[‘body’][‘sort’][0][‘_score’]); $ consulta actualizada[‘body’][‘query’][‘bool’][‘filter’] = [‘ids’ => [‘values’ => $productIds]]; $aggregationBuilder->setQuery($this->queryContainerFactory->create([‘query’ => $updatedQuery])); intente { $rawResponse = $cliente->query($updatedQuery); } catch (\Exception $e) { $this->logger->debug( «Elasticsearch7_SearchAdapter_Adapter aroundQuery » . $e->getMessage() ); $rawResponse = self::$emptyRawResponse; } $documentosraw = $respuestaraw[‘hits’][‘hits’] ?? []; $queryResponse = $this->responseFactory->create(
[
‘documents’ => $rawDocuments,
‘aggregations’ => $aggregationBuilder->build($request, $rawResponse),
‘total’ => $rawResponse[‘hits’][‘total’][‘value’] ?? 0]); devolver $queryResponse; } catch (\Exception $e) { $this->logger->debug( «Elasticsearch7_SearchAdapter_Adapter aroundQuery » . $e->getMessage() ); $this->messageManager->addError(__($e->getMessage())); } return $proceder($solicitud); } /** * Obtener clasificación personalizada del producto * * @return array */ función privada getProductCustomSortOrder() { $productos = $this->collectionFactory->create() ->addFieldToFilter(‘visibility’, [‘in’ => [3, 4]]); $evenProductId = []; $IdProductoimpar = []; foreach ($productos como $producto) { if ($producto->getEntityId() % 2 == 0) { $evenProductIds[] = $producto->getEntityId(); } más { $oddProductIds[] = $producto->getEntityId(); } } return array_merge($oddProductIds, $evenProductIds); } } El código que realmente ayuda a ordenar es. $ consulta actualizada[‘body’][‘sort’][0][‘_script’][‘type’] = ‘número’; $setSortOrderAttribute = ‘params.sortOrder.indexOf(doc[«_id»].valor)’; $ consulta actualizada[‘body’][‘sort’][0][‘_script’][‘script’][‘inline’] = $setSortOrderAttribute; $ consulta actualizada[‘body’][‘sort’][0][‘_script’][‘script’][‘params’][‘sortOrder’] = $IDproducto; Nuestro formato de consulta real se ve así. Vector(
[body] =>Matriz(
[sort] =>Matriz(
[0] =>Matriz(
[_script] =>Matriz(
[type] => número
[script] =>Matriz(
[inline] => params.sortOrder.indexOf(doc[«_id»].valor)
[params] =>Matriz(
[sortOrder] =>Matriz(
[0] =>1
[1] =>3
[2] =>5
[3] =>7
[4] =>9
[5] =>2
[6] =>4
[7] =>6
[8] => 8
[9] => 10 ) ) ) ) ) ) ) Aquí nuestra matriz sortOrder contiene todos los ID de productos impares primero y luego todos los ID de productos pares, lo que hace que nuestra lista de productos clasifique los productos de esta manera. Según el código anterior, nuestra lista de productos se verá así. Eso es todo, hemos personalizado con éxito la clasificación de nuestra lista de productos.

About Francisco

Check Also

Guía paso a paso para crear una aplicación de comercio rápido

El concepto más nuevo de aplicaciones de comercio electrónico está transformando la conveniencia con las …

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *