Implementação de um mecanismo de pesquisa fácil de usar em entidades de doutrina.
Para uso básico, tudo o que você precisa fazer é definir um mapa das entidades pesquisadas e suas propriedades, o mecanismo de pesquisa providenciará que elas sejam carregadas corretamente e classificará automaticamente os resultados de pesquisa com base nos candidatos encontrados.
O objetivo do pacote é fornecer uma API simples para pesquisa avançada de texto completo em entidades doutrinas. No início de uma solicitação, um esquema de pesquisa é construído e este pacote garante automaticamente que os melhores resultados sejam encontrados e devolvidos com base na relevância.
Para instalar manualmente o compositor de chamadas de pacote e executar o seguinte comando:
$ composer require baraja-core/doctrine-fulltext-search E, em seguida, registre DoctrineFulltextSearchExtension na configuração Neon:
extensions :
doctrineFulltextSearch : BarajaSearchDoctrineFulltextSearchExtension Ou você pode criar instância de BarajaSearchSearch manualmente.
A pesquisa é realizada pela construção de uma consulta (entidades e colunas de mapeamento):
$ 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 Ou você pode usar SelectorBuilder com vorações rigorosas e métodos de sugestão para criar a 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 ;Não há necessidade de escapar da saída, toda a lógica é resolvida pelo mecanismo automaticamente.
:username - a coluna será usada como legenda
!slug - A coluna será usada para pesquisa, mas ignorada na saída Perex.
_durationTime - A coluna será carregada na entidade, mas não será levada em consideração ao calcular a relevância e não será incluída no Perex.
content.versions.haystack - Um relacionamento entre entidades cria automaticamente uma junção e carrega a última propriedade.
versions(content) - Getter personalizado (participe automaticamente da coluna versions , mas ligue para getContent() para obter os dados).
Se usarmos um cólon no início do nome da coluna (por exemplo ':username' ), ele será automaticamente usado como um título.
O título será exibido mesmo que não contenha as palavras de pesquisa.
A legenda pode estar vazia e pode não existir (pode ser null ).
Se o título não existir, o mecanismo poderá calculá -lo automaticamente de acordo com a melhor ocorrência no texto encontrado.
A consulta de pesquisa é automaticamente normalizada e as palavras de parada são removidas, para as quais não faz sentido pesquisar.
O algoritmo pode ser substituído em um projeto específico implementando a interface IQueryNormalizer e substituindo -o no contêiner DIC.
A saída do método search() é uma entidade do tipo SearchResult , que implementa a interface Iterator para a capacidade de percorrer facilmente os resultados.
Dica: se você só precisar imprimir os resultados da pesquisa rapidamente e os requisitos de aparência não serão muito altos, a entidade
SearchResultimplementa diretamente o método__toString()para facilitar a renderização dos resultados diretamente como HTML.
O resultado da pesquisa resume todos os resultados de todas as pesquisas em todas as entidades. Todos os resultados são obtidos pelo método getItems() - a saída será uma matriz de entidades do tipo SearchItem[] .
No entanto, geralmente precisamos compilar uma consulta a granel e depois listar, por exemplo, categorias e produtos separadamente. Para fazer isso, use o método auxiliar getItemsOfType(string $type) , que retorna uma matriz truncada de resultados do tipo SearchItem[] apenas para entidades de acordo com o parâmetro aprovado.
Usamos o método getItems() ou getItemsOfType() para obter os resultados da pesquisa pela qual passamos. Mas como trabalhar com um resultado específico?
É importante observar que, neste momento, não temos mais o método __toString() disponível e devemos renderizar o resultado (idealmente em um modelo) nós mesmos.
Para a maioria dos casos, os ajudantes prontos serão suficientes:
getTitle() retorna o título da entidade encontrada como string ou nula.getTitleHighlighted() chama getTitle() internamente e, se o resultado for uma string válida, mancha as ocorrências de cada palavra com <i class="highlight"> e </i> .getSnippet() retorna um trecho da entidade encontrada, que resume a área mais encontrada na entidade original (por exemplo, um trenó em que as palavras de pesquisa ocorrem). Mais trechos podem ser devolvidos (ocorrências individuais são divididas por um cólon). Sempre retorna uma string (pode estar vazia).getTitleHighlighted() chamadas internamente getSnippet() e cores as ocorrências de cada palavra com <i class="highlight"> e </i> .getScore() retorna o parente (contextualmente diferente de acordo com a consulta de pesquisa e os dados disponíveis em cada projeto), avaliação do resultado do resultado (de acordo com este parâmetro, os resultados são classificados automaticamente).getEntity() retorna a entidade encontrada original que a doutrina produziu internamente. A pesquisa é realizada usando a seleção parcial; portanto, nem todas as propriedades podem estar sempre disponíveis.entityToArray() se retorna como uma matriz. As cordas são automaticamente normalizadas. Ambos os métodos para obter resultados ( getItems() e getItemsOfType() ) aceitam os parâmetros $limit (padrão 10 ) e $offset (padrão 0 ).
A paginação em si é melhor implementada usando a paginação Nette.
O número total de resultados é obtido pelo método getCountResults() acima da entidade SearchResult .
O mecanismo de pesquisa usa PARTIAL para carregar entidades do banco de dados e envolver as entidades resultantes nos resultados de pesquisa, para que você possa carregá -las a qualquer momento ligando para o que liga ->getEntity() acima de um resultado específico de pesquisa.
Se nenhum resultado puder ser encontrado, ou seu número for "pequeno" (a definição é determinada pelo próprio algoritmo de acordo com a análise de um projeto específico), uma dica para a melhor correção da consulta de pesquisa pode (e pode não) estar disponível.
Para obter ajuda, ligue para o método getDidYouMean() sobre SearchResult . A saída é string (melhor consulta de pesquisa) ou nula.
A melhor correção da consulta de pesquisa é obtida pelo próprio mecanismo de pesquisa com base em análises avançadas de pesquisa em cada projeto separadamente, usando os métodos de aprendizado de máquina . A cada pesquisa, estatísticas sobre a consulta de pesquisa, o número de resultados e outros sinais são salvos e analisados automaticamente, se necessário.
Obter ajuda é natural e não pode ser facilmente influenciado. O mecanismo de pesquisa busca a máxima objetividade e oferece aos usuários palavras que pesquisam outras pessoas e retornam o maior número possível de resultados relevantes de acordo com o contexto atual. Internamente, são usadas funções matemáticas complexas, que estamos constantemente melhorando com base na experiência de todos os projetos.
Ao pesquisar, uma lista de candidatos para os resultados da pesquisa é compilada pela primeira vez. Esses resultados são passados individualmente através de um algoritmo de avaliação que executa uma avaliação "relativa" automática no intervalo de 0 - 512 (com base em vários sinais, como a consulta de pesquisa, histórico recente do usuário, idioma, localização física, conteúdo e tipo de entidade) (o resultado é sempre int ).
De acordo com a avaliação de pontos, os resultados são classificados automaticamente.
O algoritmo de pontuação pode ser substituído pela implementação da interface IScoreCalculator e substituindo -a no contêiner DIC.
baraja-core/doctrine-fulltext-search é licenciado sob a licença do MIT. Consulte o arquivo de licença para obter mais detalhes.