<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AI archivos - KumbiaPHP Framework PHP en español</title>
	<atom:link href="https://kumbiaphp.com/blog/category/ai/feed/" rel="self" type="application/rss+xml" />
	<link>https://kumbiaphp.com/blog/category/ai/</link>
	<description>Web &#38; app MVC PHP framework</description>
	<lastBuildDate>Mon, 24 Nov 2025 21:51:00 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://kumbiaphp.com/blog/wp-content/uploads/2016/01/250-150x150.png</url>
	<title>AI archivos - KumbiaPHP Framework PHP en español</title>
	<link>https://kumbiaphp.com/blog/category/ai/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">123854898</site>	<item>
		<title>Chatbots inteligentes en PHP con KumbiaPHP</title>
		<link>https://kumbiaphp.com/blog/2025/11/07/chatbots-inteligentes-en-php-con-kumbiaphp/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=chatbots-inteligentes-en-php-con-kumbiaphp</link>
					<comments>https://kumbiaphp.com/blog/2025/11/07/chatbots-inteligentes-en-php-con-kumbiaphp/#respond</comments>
		
		<dc:creator><![CDATA[HenryStivens]]></dc:creator>
		<pubDate>Fri, 07 Nov 2025 06:00:00 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Tutoriales y screencast]]></category>
		<category><![CDATA[ejemplos]]></category>
		<guid isPermaLink="false">https://kumbiaphp.com/blog/?p=2975</guid>

					<description><![CDATA[<p>¿Qué es un chatbot inteligente? Un chatbot con PHP es un asistente virtual que usa inteligencia artificial para simular&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2025/11/07/chatbots-inteligentes-en-php-con-kumbiaphp/">Chatbots inteligentes en PHP con KumbiaPHP</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: center;"><iframe title="YouTube video player" src="https://www.youtube.com/embed/ksijcOJSRAY?si=EPYBZNdJ6_KcJo0U" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>

<h2>¿Qué es un chatbot inteligente?</h2>
<p>Un chatbot con <a href="https://kumbiaphp.com/blog/category/php/">PHP</a> es un asistente virtual que usa inteligencia artificial para simular una conversación natural con usuarios, realizando tareas como responder preguntas, agendar citas, brindar soporte técnico y más. Implementar un chatbot inteligente utilizando PHP puede potenciar significativamente tu aplicación web.</p>
<p data-pm-slice="1 1 []">Veremos paso a paso cómo configurar las dependencias, conectar con el modelo GPT-4 y construir una interfaz simple que permita interactuar con el asistente directamente desde tu aplicación web.</p>
<h2>Herramientas recomendadas para crear chatbots con PHP</h2>
<ul data-spread="false">
<li>
<p><a href="https://openai.com/es-ES/api/"><strong>OpenAI API</strong></a>: Facilita el acceso a modelos avanzados como GPT-4 para procesamiento de lenguaje natural y es ideal para construir un chatbot con PHP.</p>
</li>
<li>
<p><a href="https://dialogflow.cloud.google.com/"><strong>Dialogflow</strong></a>: Servicio gestionado de Google que simplifica la creación de interfaces conversacionales y puede integrarse fácilmente como chatbot con PHP.</p>
</li>
<li>
<p><a href="https://rasa.com/"><strong>Rasa</strong></a>: Alternativa open source para chatbots personalizados y con mayor control, perfecta para crear un chatbot con PHP.</p>
</li>
</ul>
<h2>Creando un chatbot con PHP y KumbiaPHP usando la API de OpenAI</h2>
<h4>Paso 1: Instalar dependencias</h4>
<p>Usa Composer para instalar la librería oficial de OpenAI para tu chatbot con PHP (<a href="https://packagist.org/packages/openai-php/client">Packagist de</a><br /><a href="https://packagist.org/packages/openai-php/client">OpenAI PHP</a>):</p>


<pre class="wp-block-code language-bash"><code>composer require openai-php/client</code></pre>



<span id="more-2975"></span>


<h4 data-pm-slice="1 1 []">Paso 2: Configuración específica para OpenAI</h4>
<p>Crea un archivo específico para la configuración en <em>config/openai.php</em> para tu chatbot con PHP:</p>


<pre class="wp-block-code language-php"><code>&lt;?php

return &#091;
    &#039;api_key&#039; =&gt; &#039;TU_API_KEY&#039;,
    &#039;model&#039; =&gt; &#039;gpt-4-turbo&#039;,
    &#039;systemPrompt&#039; =&gt; 
        &#039;Eres un asistente útil. Te llamas Kumbita y amas Kumbiaphp&#039;,
];</code></pre>


<h4 data-pm-slice="1 1 []">Paso 3: Crear modelo para lógica de OpenAI</h4>
<p>Crea el archivo <em>app/models/open_ai_model.php</em>, esencial para desarrollar un chatbot con PHP:</p>


<pre class="wp-block-code language-php"><code>&lt;?php

use \OpenAI\Client;

/**
 * OpenAI Service Model
 */
class OpenAiModel
{
    /**
     * @var OpenAiModel|null Instancia única de la clase
     */
    private static ?OpenAiModel $instance;

    /**
     * @var Client El cliente OpenAI
     */
    private Client $client;

    /**
     * @var array Configuración de OpenAI
     */
    private array $config;

    /**
     * Constructor para otras config
     *
     * @param array Configuración (opcional)
     */
    public function __construct(?array $config = null)
    {
        $this-&gt;config = $config ?? Config::read(&#039;openai&#039;);
        $this-&gt;client = OpenAI::client($this-&gt;config&#091;&#039;api_key&#039;]);
    }

    /**
     * Obtiene la instancia única del servicio
     *
     * @param array Configuración (opcional)
     * @return OpenAiModel
     */
    public static function getInstance(?array $config = null): self
    {
        return self::$instance ??= new self($config);
    }

    /**
     * Obtiene el cliente OpenAI
     * 
     * @return Client
     */
    public function getClient(): Client
    {
        return $this-&gt;client;
    }

    /**
     * Envía un mensaje a OpenAI y recibe la respuesta
     * 
     * @param string $message El mensaje del usuario
     * @param string $systemPrompt El prompt del sistema (opcional)
     *
     * @return string La respuesta del modelo
     */
    public function sendMessage(string $message, ?string $systemPrompt = null): string
    {
        $response = $this-&gt;client-&gt;chat()-&gt;create(&#091;
            &#039;model&#039; =&gt; $this-&gt;config&#091;&#039;model&#039;],
            &#039;messages&#039; =&gt; &#091;
                &#091;
                  &#039;role&#039; =&gt; &#039;system&#039;,
                  &#039;content&#039; =&gt; $systemPrompt ?? $this-&gt;config&#091;&#039;systemPrompt&#039;]
                ],
                &#091;
                  &#039;role&#039; =&gt; &#039;user&#039;,
                  &#039;content&#039; =&gt; $message
                ],
            ],
        ]);

        return $response-&gt;choices&#091;0]-&gt;message-&gt;content;
    }
}</code></pre>


<h4 data-pm-slice="1 1 []">Paso 4: Crear controlador Chatbot en KumbiaPHP</h4>


<pre class="wp-block-code language-php"><code>&lt;?php

class ChatbotController extends AppController
{
    /**
     * Muestra el chatbot
     */
    public function index()
    {
    }

    /**
     * Endpoint para manejar mensajes del chatbot
     */
    public function message()
    {
        View::select(null, &#039;json&#039;);

        $message = Input::post(&#039;message&#039;);

        $this-&gt;data = match ($message) {
            null, &#039;&#039; =&gt; &#091;],
            default =&gt;  &#091;&#039;reply&#039; =&gt; OpenAiModel::getInstance()-&gt;sendMessage($message)],
        };
    }
}
</code></pre>


<h4 data-pm-slice="1 1 []">Paso 5: Crear la vista del chatbot en KumbiaPHP</h4>
<p>Crea la vista <em>index.phtml</em> en <em>app/views/chatbot/</em> para interactuar fácilmente con tu chatbot con PHP:</p>


<pre class="wp-block-code language-php"><code>&lt;section id=&quot;aibot&quot;&gt;
    &lt;h1&gt;Chatbot Inteligente con PHP y KumbiaPHP&lt;/h1&gt;

    &lt;div id=&quot;chatResponse&quot;&gt;
        &lt;p&gt;
            &lt;b&gt;Kumbita:&lt;/b&gt; Hola, me llamo Kumbita. ¿Qué quieres saber hoy?
        &lt;/p&gt;
    &lt;/div&gt;

    &lt;?= Form::open(&#039;&#039;, &#039;POST&#039;, &#039;id=&quot;chatbot&quot;&#039;) ?&gt;
    &lt;?= Form::text(&#039;message&#039;, &#039;placeholder=&quot;Escribe tu pregunta&quot; autofocus&#039;) ?&gt;
    &lt;?= Form::submit(&#039;Enviar&#039;, &#039;class=&quot;btn btn-primary&quot;&#039;) ?&gt;
    &lt;?= Form::close() ?&gt;
&lt;/section&gt;

&lt;script&gt;
    document.getElementById(&quot;chatbot&quot;).addEventListener(&quot;submit&quot;,
        function(event) {
            event.preventDefault();
            sendMessage();
        });

    const messageEl = document.getElementById(&#039;message&#039;);
    const chatResponse = document.getElementById(&#039;chatResponse&#039;);
    const btnSubmit = document.querySelector(&#039;#chatbot &#091;type=&quot;submit&quot;]&#039;);
    const speech = &#039;speechSynthesis&#039; in window ? new SpeechSynthesisUtterance() : null;
    const apiError = &quot;Lo siento, parece que hay un error al conectar a la API&quot;;

    speak(&quot;Hola, me llamo Kumbita. ¿Qué quieres saber hoy?&quot;, &quot;es&quot;);

    function sendMessage() {
        const message = messageEl.value;
        if(message.trim() === &#039;&#039;) return;
        btnSubmit.disabled = true;
        messageEl.disabled = true;
        chatResponse.innerHTML += `&lt;p&gt;&lt;b&gt;Tu:&lt;/b&gt; ${message}&lt;/p&gt;&lt;div id=&quot;loading&quot;&gt;&lt;/div&gt;`;
        chatResponse.scrollTop = chatResponse.scrollHeight;

        fetch(&#039;/chatbot/message&#039;, {
                method: &#039;POST&#039;,
                headers: {
                    &#039;Content-Type&#039;: &#039;application/x-www-form-urlencoded&#039;,
                    &#039;Accept&#039;: &#039;application/json&#039;
                },
                body: &#039;message=&#039; + encodeURIComponent(message)
            })
            .then(response =&gt; response.json())
            .then(data =&gt; {
                response(data.reply ?? &quot;&quot;);
            })
            .catch(error =&gt; {
                console.log(error);
                response(apiError);
            })
            .finally(() =&gt; {
                btnSubmit.disabled = false;
                messageEl.disabled = false;
                messageEl.value = &#039;&#039;;
                messageEl.focus();
            });
    }

    function response(message) {
        speak(message);
        document.getElementById(&#039;loading&#039;).remove();
        chatResponse.innerHTML += `&lt;p&gt;&lt;b&gt;Kumbita:&lt;/b&gt; ${message}&lt;/p&gt;`;
        chatResponse.scrollTop = chatResponse.scrollHeight;
    }

    function speak(text, lang = navigator.language) {
        if(!speech) return;
        speech.lang = lang
        speech.text = text
        window.speechSynthesis.speak(speech)
    }
&lt;/script&gt;

&lt;style&gt;
    #aibot {
        max-width: 500px;
        margin: 0 auto;

        &amp; h1 {
            text-align: center;
        }

        &amp; #chatbot {
            display: flex;
            margin-top: 1em;
        }

        &amp; #message {
            flex: 1;
            border-radius: 2rem 0 0 2rem;
            padding: 0.5em 1em;
            box-shadow: none;

            &amp;:focus {
                outline: none;
            }
        }

        &amp; &#091;type=&quot;submit&quot;] {
            flex: 0;
            border-radius: 0 2rem 2rem 0;
            box-shadow: none;
            
            &amp;:disabled {
                opacity: 0.5;
            }
        }

        &amp; #chatResponse {
            margin: 20px auto 0;
            min-height: 60px;
            max-height: 400px;
            background: #f5f5f5;
            border-radius: 6px;
            padding: 1em;
            box-shadow: 1px 1px 5px #eee;
            overflow-y: auto;
            display: flex;
            flex-direction: column;

            &amp; p {
                color: #333;
            }
        }
    }
    #loading {
        width: 12px;
        height: 12px;
        border-radius: 50%;
        display: block;
        margin:15px auto;
        position: relative;
        color: #9ab8ef;
        box-sizing: border-box;
        animation: animloader 1s linear infinite alternate;
    }

    @keyframes animloader {
        0% {box-shadow: -38px -6px, -14px 6px,  14px -6px;}
        33% {box-shadow: -38px 6px, -14px -6px,  14px 6px;}
        66% {box-shadow: -38px -6px, -14px 6px, 14px -6px;}
        100% {box-shadow: -38px 6px, -14px -6px, 14px 6px;}
    }
&lt;/style&gt;
</code></pre>



<figure class="wp-block-image size-large"><a href="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-chatbot-openai.jpg"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-chatbot-openai-1024x576.jpg" alt="Chatbot inteligente con PHP Y KumbiaPHP" class="wp-image-2989" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-chatbot-openai-1024x576.jpg 1024w, https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-chatbot-openai-300x169.jpg 300w, https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-chatbot-openai-768x432.jpg 768w, https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-chatbot-openai-1536x864.jpg 1536w, https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-chatbot-openai-940x529.jpg 940w, https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-chatbot-openai.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>


<h3 data-pm-slice="1 1 []">Ventajas de usar chatbots en aplicaciones PHP</h3>
<ul data-spread="false">
<li>
<p>Disponibilidad 24/7.</p>
</li>
<li>
<p>Respuestas inmediatas y personalizadas.</p>
</li>
<li>
<p>Optimización de recursos humanos y reducción de costos operativos.</p>
</li>
</ul>
<p>Este ejemplo constituye una <strong>base sólida</strong> para comprender cómo integrar inteligencia artificial en tus proyectos PHP con KumbiaPHP. A partir de aquí, puedes ampliarlo añadiendo <strong>manejo de historial de conversación</strong>, <strong>personalización de prompts del sistema</strong>, <strong>validaciones adicionales de entrada</strong>, o incluso <strong>mecanismos de seguridad</strong> para evitar abusos en el endpoint.</p>
<p>Al finalizar esta guía, tendrás un chatbot completamente funcional listo para integrarse en cualquier proyecto desarrollado con KumbiaPHP. Anímate a probarlo, experimentar con sus respuestas y descubrir el potencial de combinar la sencillez de PHP con la potencia de la inteligencia artificial. Si te ha resultado útil, <strong>comparte este artículo</strong> o deja tus comentarios en el blog para seguir mejorando juntos.</p>


<h2 class="wp-block-heading">Agradecimientos</h2>



<p>Agradecemos especialmente a @joanhey por tomarse el tiempo de revisar y mejorar el código de ejemplo, aportando sugerencias valiosas que ayudaron a hacerlo más claro y funcional para la comunidad de desarrolladores de KumbiaPHP.</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2025/11/07/chatbots-inteligentes-en-php-con-kumbiaphp/">Chatbots inteligentes en PHP con KumbiaPHP</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://kumbiaphp.com/blog/2025/11/07/chatbots-inteligentes-en-php-con-kumbiaphp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2975</post-id>	</item>
		<item>
		<title>Buscador avanzado de texto completo para KumbiaPHP con Meilisearch</title>
		<link>https://kumbiaphp.com/blog/2025/04/19/buscador-avanzado-texto-completo-kumbiaphp-meilisearch/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=buscador-avanzado-texto-completo-kumbiaphp-meilisearch</link>
					<comments>https://kumbiaphp.com/blog/2025/04/19/buscador-avanzado-texto-completo-kumbiaphp-meilisearch/#respond</comments>
		
		<dc:creator><![CDATA[HenryStivens]]></dc:creator>
		<pubDate>Sat, 19 Apr 2025 08:00:00 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Tutoriales y screencast]]></category>
		<category><![CDATA[buscador]]></category>
		<category><![CDATA[ejemplos]]></category>
		<guid isPermaLink="false">https://kumbiaphp.com/blog/?p=2903</guid>

					<description><![CDATA[<p>La entrada <a href="https://kumbiaphp.com/blog/2025/04/19/buscador-avanzado-texto-completo-kumbiaphp-meilisearch/">Buscador avanzado de texto completo para KumbiaPHP con Meilisearch</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div style="text-align:center;"><iframe width="560" height="315" src="https://www.youtube.com/embed/knyUp-Wleg4?si=b5TdpovBYkE4dCpm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>



<p class="" data-start="271" data-end="624">Si estás buscando implementar un <strong data-start="304" data-end="374">buscador avanzado de texto completo para KumbiaPHP con <a href="https://www.meilisearch.com/">Meilisearch</a></strong>, este artículo te mostrará cómo hacerlo de manera sencilla, efectiva y escalable. Descubre cómo aprovechar todo el potencial de Meilisearch en tus aplicaciones KumbiaPHP, ofreciendo a tus usuarios búsquedas rápidas y resultados altamente relevantes.</p>
<h2>¿Por qué utilizar un buscador avanzado de texto completo para KumbiaPHP con Meilisearch?</h2>
<p>Implementar un <strong data-start="739" data-end="809">buscador avanzado de texto completo para KumbiaPHP con Meilisearch</strong> permite llevar las capacidades de búsqueda de tus aplicaciones a otro nivel. Meilisearch es un motor de búsqueda rápido, potente y de fácil configuración, ideal para aplicaciones modernas que requieren búsquedas en tiempo real, autocompletado y manejo de grandes volúmenes de datos.<br data-start="1020" data-end="1023" />Además, gracias a sus capacidades de búsqueda semántica impulsada por inteligencia artificial, se pueden obtener resultados mucho más precisos incluso cuando las palabras de búsqueda no coinciden exactamente con los términos indexados.</p>
<h2>Requisitos</h2>
<p>Antes de comenzar a integrar un <strong data-start="2097" data-end="2167">buscador avanzado de texto completo para KumbiaPHP con Meilisearch</strong>, verifica que tu entorno cumpla con los siguientes requisitos básicos:</p>
<ul>
<li>
<p>Tener una aplicación funcionando con <strong><a href="https://kumbiaphp.com/blog/manuales-y-descargas/">KumbiaPHP 1.2</a> o superior</strong>.</p>
</li>
<li>
<p>Tener <strong><a href="_wp_link_placeholder" data-wplink-edit="true">PHP 8.0</a> o superior</strong>.</p>
</li>
<li>
<p>Tener acceso al servidor o contenedor donde correrá <strong>Meilisearch</strong>.</p>
</li>
<li>
<p>Instalar el cliente de Meilisearch para PHP con Composer:</p>
</li>
</ul>
<pre><code class="language-bash">composer require meilisearch/meilisearch-php \
guzzlehttp/guzzle \
http-interop/http-factory-guzzle:^1.0</code></pre>
<ul>
<li>
<p>Instalar el nuevo ActiveRecord de KumbiaPHP si aún no lo tienes:</p>
</li>
</ul>
<pre><code class="language-bash">composer require kumbia/activerecord
</code></pre>
<blockquote>
<p>Este nuevo ActiveRecord es un componente externo que puedes usar en cualquier proyecto PHP, y es requerido para que los modelos soporten los callbacks usados por el trait MeilisearchSearchable.</p>
</blockquote>
<h2 id="configuraci%C3%B3n-del-cliente-meilisearch-singleton" class="code-line" dir="auto" data-line="31">Configuración del Cliente Meilisearch</h2>
<p class="code-line" dir="auto" data-line="33">Crea el archivo <em>default/app/config/meilisearch.php</em> con la siguiente estructura:</p>



<span id="more-2903"></span>



<pre class="wp-block-code language-php"><code>&lt;?php
/**
 * MeiliSearch configuration file.
 *
 * This file contains the configuration settings for connecting to MeiliSearch.
 */
return &#091;
    &#039;host&#039; =&gt; &#039;http://127.0.0.1:7700&#039;, // Change the host
    &#039;api_key&#039; =&gt; &#039;&#039;, // Change the key
];
</code></pre>



<h2 id="integrando-meilisearch-con-el-trait-meilisearchsearchabletrait" class="code-line" dir="auto" data-line="63">Trait MeilisearchSearchableTrait</h2>
<p class="code-line" dir="auto" data-line="65">Crea el archivo&nbsp;<em>default/app/libs/meilisearch_searchable_trait.php</em> con el siguiente código:</p>



<pre class="wp-block-code language-php"><code>&lt;?php

use Meilisearch\Client;

/**
 * Trait MeilisearchSearchableTrait
 */
trait MeilisearchSearchableTrait
{
    /**
     * MeiliSearch client instance.
     */
    protected static ?Client $_meiliClient = null;

    /**
     * Retrieves the MeiliSearch client instance.
     */
    protected static function getMeiliClient(): Client
    {
        if (null !== self::$_meiliClient) {
            return self::$_meiliClient;
        }

        $config = \Config::read(&#039;meilisearch&#039;);
        if (!$config || !is_array($config)) {
            throw new \RuntimeException(&#039;MeiliSearch configuration not found in config file.&#039;);
        }
        $host   = $config&#091;&#039;host&#039;] ?? &#039;http://localhost:7700&#039;;
        $apiKey = $config&#091;&#039;api_key&#039;] ?? &#039;&#039;;

        return self::$_meiliClient = new Client($host, $apiKey);
    }

    /**
     * Returns the index name. By default it returns the table name provided by the model.
     */
    protected static function searchableAs(): string
    {
        return static::getTable();
    }

    /**
     * Converts the model instance to an array for indexing.
     */
    abstract protected function toSearchArray(): array;

    /**
     * Callback executed after a model is created.
     * The new record is automatically added to the MeiliSearch index.
     */
    protected function _afterCreate(): void
    {
        self::getMeiliClient()
            -&gt;index(static::searchableAs())
            -&gt;addDocuments(&#091;$this-&gt;toSearchArray()]);
    }

    /**
     * Callback executed after a model is updated.
     * The updated record is synchronized in the MeiliSearch index.
     */
    protected function _afterUpdate(): void
    {
        self::getMeiliClient()
            -&gt;index(static::searchableAs())
            -&gt;updateDocuments(&#091;$this-&gt;toSearchArray()]);
    }

    /**
     * Deletes a record and synchronizes the deletion with the MeiliSearch index.
     */
    public static function delete($pk): bool
    {
        $deleted = parent::delete($pk);

        if ($deleted) {
            self::getMeiliClient()
                -&gt;index(static::searchableAs())
                -&gt;deleteDocument($pk);
        }

        return $deleted;
    }

    /**
     * Performs a search query on the MeiliSearch index.
     */
    public static function search(string $query, array $options = &#091;]): array
    {
        $results = self::getMeiliClient()
            -&gt;index(static::searchableAs())
            -&gt;search($query, $options);

        return $results-&gt;getHits();
    }

    /**
     * Bulk-imports existing records into the MeiliSearch index.
     */
    public static function importToMeilisearch(int $chunkSize = 500): void
    {
        $offset = 0;

        do {
            $records = static::filter(&quot;LIMIT $chunkSize OFFSET $offset&quot;);
            $data    = &#091;];

            foreach ($records as $record) {
                $data&#091;] = $record-&gt;toSearchArray();
            }

            if (!empty($data)) {
                self::getMeiliClient()
                    -&gt;index(static::searchableAs())
                    -&gt;addDocuments($data);
            }

            $offset += $chunkSize;
        } while (count($records) === $chunkSize);
    }
}
</code></pre>



<h2>Ventajas del Trait MeilisearchSearchable</h2>
<ul>
<li>
<p><strong>Integración simple</strong>: Reutiliza fácilmente la funcionalidad en múltiples modelos.</p>
</li>
<li>
<p><strong>Automatización</strong>: Mantiene sincronizados automáticamente tus modelos con el índice de búsqueda.</p>
</li>
<li>
<p><strong>Flexibilidad</strong>: Puedes personalizar fácilmente el comportamiento de búsqueda por cada modelo.</p>
</li>
<li><strong>Inteligencia Artificial:</strong> Soporte para búsqueda semántica mediante integración con IA (OpenAI u otros proveedores).</li>
</ul>
<h2 class="" data-start="3331" data-end="3432">Cómo utilizar en la práctica un buscador avanzado de texto completo para KumbiaPHP con Meilisearch</h2>



<h3 data-pm-slice="1 1 []">Paso 1: Implementación en Modelos</h3>
<p>A continuación, integra el trait en tus modelos que extiendan de LiteRecord:</p>
<h4>Ejemplo con Modelo Product</h4>



<pre class="wp-block-code language-php"><code>&lt;?php

use Kumbia\ActiveRecord\LiteRecord;

class Product extends LiteRecord
{
    use MeilisearchSearchableTrait;

    protected static $table = &#039;products&#039;;

    protected function toSearchArray(): array
    {
        return &#091;
            &#039;id&#039; =&gt; $this-&gt;id,
            &#039;name&#039; =&gt; $this-&gt;name,
            &#039;description&#039; =&gt; $this-&gt;description,
            &#039;price&#039; =&gt; $this-&gt;price,
        ];
    }
}</code></pre>



<h4 data-pm-slice="1 1 []">Ejemplo con Modelo Article</h4>



<pre class="wp-block-code language-php"><code>&lt;?php

use Kumbia\ActiveRecord\LiteRecord;

class Article extends LiteRecord
{
    use MeilisearchSearchableTrait;

    protected static $table = &#039;articles&#039;;

    protected function toSearchArray(): array
    {
        return &#091;
            &#039;id&#039; =&gt; $this-&gt;id,
            &#039;title&#039; =&gt; $this-&gt;title,
            &#039;content&#039; =&gt; $this-&gt;content,
            &#039;author&#039; =&gt; $this-&gt;author,
        ];
    }
}</code></pre>



<p data-pm-slice="1 1 []">Una vez implementado el trait en tus modelos, realizar búsquedas será simple y eficaz. Estos ejemplos prácticos ilustran claramente cómo aprovechar tu nuevo <strong data-start="3591" data-end="3661">buscador avanzado de texto completo para KumbiaPHP con Meilisearch</strong>.</p>
<h3 data-pm-slice="1 1 []">Paso 2: Realizar búsquedas fácilmente</h3>
<p>Ahora puedes realizar búsquedas en tus modelos:</p>



<pre class="wp-block-code language-php"><code>// Buscar productos
$products = Product::search(&#039;zapatos deportivos&#039;, &#091;&#039;limit&#039; =&gt; 10]);

// Buscar artículos
$articles = Article::search(&#039;tecnología&#039;, &#091;&#039;limit&#039; =&gt; 5]);</code></pre>



<h3 data-pm-slice="1 1 []">Paso 3: Importar datos existentes</h3>
<p>Si ya tienes datos almacenados en tu base de datos, puedes importarlos fácilmente:</p>



<pre class="wp-block-code language-php"><code>Product::importToMeilisearch();
Article::importToMeilisearch();</code></pre>



<h2 data-pm-slice="1 1 []">Ejemplo de Mielisearch con Controlador y Vista en KumbiaPHP</h2>
<h3>Paso 1: Crea el controlador</h3>
<p>Controlador: <em>app/controllers/products_controller.php</em></p>



<pre class="wp-block-code language-php"><code>class ProductsController extends AppController
{
    public function search()
    {
        if (Input::hasPost(&#039;query&#039;)) {
            $this-&gt;results = Product::search(Input::post(&#039;query&#039;));
        }
    }
}</code></pre>



<h3 data-pm-slice="1 1 []">Paso 2: Crea la vista</h3>
<p data-pm-slice="1 1 []">Vista: <em>app/views/products/search.phtml</em></p>



<pre class="wp-block-code language-php"><code>&lt;h1&gt;Buscar productos&lt;/h1&gt;

&lt;?php View::content(); ?&gt;

&lt;?= Form::open(); ?&gt;
    &lt;?= Form::text(&#039;query&#039;, &#039;placeholder=&quot;Buscar...&quot;&#039;) ?&gt;
    &lt;?= Form::submit(&#039;Buscar&#039;) ?&gt;
&lt;?= Form::close(); ?&gt;

&lt;?php if (empty($results) &amp;&amp; Input::post(&#039;query&#039;)): ?&gt;
    &lt;p&gt;No se encontraron resultados.&lt;/p&gt;
    &lt;?php return 1 ?&gt;
&lt;?php endif; ?&gt;

&lt;h2&gt;Resultados&lt;/h2&gt;
&lt;ul&gt;
    &lt;?php foreach ($results as $product): ?&gt;
        &lt;li&gt;
            &lt;strong&gt;&lt;?= h($product&#091;&#039;name&#039;]) ?&gt;&lt;/strong&gt;&lt;br&gt;
            &lt;?= h($product&#091;&#039;description&#039;]) ?&gt;&lt;br&gt;
            Precio: $&lt;?= h($product&#091;&#039;price&#039;]) ?&gt;
        &lt;/li&gt;
    &lt;?php endforeach; ?&gt;
&lt;/ul&gt;
</code></pre>



<p data-pm-slice="1 1 []">La combinación de KumbiaPHP con Meilisearch a través del trait MeilisearchSearchable te permite ofrecer una experiencia superior en búsquedas a tus usuarios. Con la posibilidad de usar IA para búsquedas semánticas, la calidad de los resultados se eleva aún más. La integración es simple, escalable y potente, haciendo que valga la pena el esfuerzo inicial.</p>
<p>¡Prueba esta integración y lleva tus búsquedas al siguiente nivel con KumbiaPHP y Meilisearch!</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2025/04/19/buscador-avanzado-texto-completo-kumbiaphp-meilisearch/">Buscador avanzado de texto completo para KumbiaPHP con Meilisearch</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://kumbiaphp.com/blog/2025/04/19/buscador-avanzado-texto-completo-kumbiaphp-meilisearch/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2903</post-id>	</item>
	</channel>
</rss>
