Implementación de un motor de búsqueda fácil de usar en entidades de doctrina.
Para uso básico, todo lo que tiene que hacer es definir un mapa de las entidades buscadas y sus propiedades, el motor de búsqueda arreglará para que se carguen correctamente y ordenará automáticamente los resultados de búsqueda en función de los candidatos encontrados.
El propósito del paquete es proporcionar una API simple para la búsqueda avanzada de texto completo en entidades de doctrina. Al comienzo de una solicitud, se crea un esquema de búsqueda y este paquete garantiza automáticamente que los mejores resultados se encuentren y devuelvan según la relevancia.
Para instalar manualmente el compositor de llamadas de paquete y ejecutar el siguiente comando:
$ composer require baraja-core/doctrine-fulltext-search Y luego registre DoctrineFulltextSearchExtension en la configuración neón:
extensions :
doctrineFulltextSearch : BarajaSearchDoctrineFulltextSearchExtension O puede crear una instancia de BarajaSearchSearch manualmente.
La búsqueda se realiza construyendo una consulta (entidades de mapeo y columnas):
$ results = $ this -> search -> search ( $ query , [
Article ::class => [ ' :title ' ],
User ::class => ' :username ' , // it can also be an ordinary string for a single column
UserLogin ::class => [ ' :ip ' , ' hostname ' , ' userAgent ' ],
]);
echo $ results ; // Uses the default HTML renderer O puede usar SelectorBuilder con validaciones de tipo estricto y métodos de insinuación para construir la consulta:
$ results = $ this -> search -> selectorBuilder ( $ query )
-> addEntity ( Article ::class)
-> addColumnTitle ( ' title ' )
-> addEntity ( User ::class)
-> addColumnTitle ( ' username ' )
-> addEntity ( UserLogin ::class)
-> addColumnTitle ( ' ip ' )
-> addColumn ( ' hostname ' )
-> addColumnSearchOnly ( ' userAgent ' )
-> search ();
echo $ results ;No hay necesidad de escapar de la salida, toda la lógica se resuelve automáticamente por el motor.
:username : la columna se utilizará como un subtítulo
!slug : la columna se usará para buscar, pero se ignorará en la salida de perex.
_durationTime : la columna se cargará en la entidad, pero no se tendrá en cuenta al calcular la relevancia y no se incluirá en el perex.
content.versions.haystack : una relación entre las entidades crea automáticamente una unión y carga la última propiedad.
versions(content) : Getter personalizado (une automáticamente la columna versions , pero llame a getContent() para obtener los datos).
Si usamos un colon al comienzo del nombre de la columna (por ejemplo ':username' ), se usará automáticamente como título.
El título se mostrará incluso si no contiene las palabras de búsqueda.
El subtítulo puede estar vacío y puede no existir (puede ser null ).
Si el título no existe, entonces el motor puede calcularlo automáticamente de acuerdo con la mejor ocurrencia en el texto encontrado.
La consulta de búsqueda se normaliza automáticamente y se eliminan las palabras de parada , para lo cual no tiene sentido buscar.
El algoritmo se puede anular en un proyecto específico mediante la implementación de la interfaz IQueryNormalizer y sobrescribirla en el contenedor DIC.
La salida del método search() es una entidad del tipo SearchResult , que implementa la interfaz Iterator para la capacidad de recorrer fácilmente los resultados.
Consejo: si solo necesita imprimir los resultados de búsqueda rápidamente y los requisitos de apariencia no son muy altos, la entidad
SearchResultimplementa directamente el método__toString()para una fácil representación de resultados directamente como HTML.
El resultado de la búsqueda resume todos los resultados de todas las búsquedas en todas las entidades. Todos los resultados se obtienen mediante el método getItems() : la salida será una matriz de entidades del tipo SearchItem[] .
Sin embargo, a menudo necesitamos compilar una consulta a granel y luego enumerar, por ejemplo, categorías y productos por separado. Para hacer esto, use el método Helper getItemsOfType(string $type) , que devuelve una matriz truncada de resultados de type SearchItem[] solo para entidades de acuerdo con el parámetro aprobado.
Utilizamos el método getItems() o getItemsOfType() para obtener los resultados de búsqueda que pasamos. ¿Pero cómo trabajar con un resultado específico?
Es importante tener en cuenta que en este punto ya no tenemos el método __toString() disponible y debemos hacer que el resultado (idealmente en una plantilla) nosotros mismos.
Para la mayoría de los casos, los ayudantes preparados serán suficientes:
getTitle() Devuelve el título de la entidad encontrada como cadena o nulo.getTitleHighlighted() llama getTitle() internamente, y si el resultado es una cadena válida, mancha las ocurrencias de cada palabra con <i class="highlight"> y </i> .getSnippet() devuelve un fragmento de la entidad encontrada, que resume el área mejor encontrada en la entidad original (por ejemplo, un fragmento de artículo donde ocurren las palabras de búsqueda). Se pueden devolver más fragmentos (los ocurrencias individuales se dividen por un colon). Siempre devuelve una cadena (puede estar vacía).getTitleHighlighted() llame internamente getSnippet() y colorea las ocurrencias de cada palabra con <i class="highlight"> y </i> .getScore() devuelve la evaluación de puntos relativo (diferente contextual de acuerdo con la consulta de búsqueda y los datos disponibles en cada proyecto) evaluación de puntos del resultado (de acuerdo con este parámetro, los resultados se clasifican automáticamente).getEntity() Devuelve la entidad encontrada original que la doctrina producía internamente. La búsqueda se realiza mediante selección parcial, por lo que no todas las propiedades siempre pueden estar disponibles.entityToArray() se devuelve como una matriz. Las cadenas se normalizan automáticamente. Ambos métodos para obtener resultados ( getItems() y getItemsOfType() ) aceptan los parámetros $limit (predeterminado 10 ) y $offset (predeterminado 0 ).
La paginación en sí se implementa mejor utilizando Nette Pagination.
El número total de resultados se obtiene mediante el método getCountResults() por encima de la entidad SearchResult .
El motor de búsqueda utiliza entidades de base de datos PARTIAL para cargar las entidades resultantes en los resultados de búsqueda, por lo que puede cargarlas en cualquier momento llamando ->getEntity() por encima de un resultado de búsqueda específico.
Si no se puede encontrar ningún resultado, o su número es "pequeño" (la definición está determinada por el algoritmo en sí de acuerdo con el análisis de un proyecto específico), un consejo para la mejor corrección de la consulta de búsqueda puede (y no) estar disponible.
Para obtener ayuda, llame al método getDidYouMean() sobre SearchResult . La salida es una cadena (mejor consulta de búsqueda) o nula.
La mejor corrección de consultas de búsqueda es obtenida por el propio motor de búsqueda en función del análisis de búsqueda avanzado dentro de cada proyecto por separado utilizando métodos de aprendizaje automático . Con cada búsqueda, las estadísticas sobre la consulta de búsqueda, el número de resultados y otras señales se guardan y analizan automáticamente retrospectivamente si es necesario.
Obtener ayuda es natural y no se puede influenciar fácilmente. El motor de búsqueda se esfuerza por la máxima objetividad y ofrece a los usuarios palabras que buscan a otros y devuelven tantos resultados relevantes como sea posible de acuerdo con el contexto actual. Internamente, se utilizan funciones matemáticas complejas, que estamos mejorando constantemente en función de la experiencia de todos los proyectos.
Al buscar, primero se compila una lista de candidatos para los resultados de búsqueda. Estos resultados se pasan individualmente a través de un algoritmo de evaluación que realiza una evaluación automática "relativa" en el rango 0 - 512 (según varias señales como la consulta de búsqueda, el historial reciente del usuario, el lenguaje, la ubicación física, el contenido de la entidad y el tipo) (el resultado siempre es int ).
Según la evaluación de puntos, los resultados se clasifican automáticamente.
El algoritmo de puntuación se puede anular implementando la interfaz IScoreCalculator y sobrescribirla en el contenedor DIC.
baraja-core/doctrine-fulltext-search tiene licencia bajo la licencia MIT. Consulte el archivo de licencia para obtener más detalles.