12.4. Tipos de Consulta
Anterior | Capítulo 12. Zend_Search | Próxima

## 12.4. Tipos de Consulta

### 12.4.1. Consulta a termo simples

São indicadas para pesquisa de termos isolados.

Ambos os métodos de pesquisa podem ser usados para consultas de termo simples.

String de busca:

        $hits = $index->find('word1');

ou

Construção da pesquisa via API:

    <?php

        $term  = new Zend_Search_Lucene_Index_Term('word1');
        $query = new Zend_Search_Lucene_Search_Query_Term($term);
        $hits  = $index->find($query);

    ?>

### 12.4.2. Consulta a múltiplos termos

São indicadas para pesquisas em um conjunto de termos.

Para cada termo pesquisado, podemos especificar o comportamento da busca.

- Termos necessários - Exibe apenas os documentos que contém o termo;

- Termos proibidos - Exibe os documentos que não contém o termo;

- Termos "neither" - Exibe os documentos contenham os termos necessários mas não contenham os proibidos. De qualquer forma, o documento pesquisado deve conter pelo menos um termo que coincida com a string de busca.

Isso implica que, se termos opcionais forem acrescentados à consulta com termos obrigatórios, eles irão produzir um mesmo conjuntoi de resultados, mas a segunda consulta irá acrescentar uma pontuação de acerto ("hits") para cada termo opcional, movendo-os para o topo do resultado.

Ambos os métodos de busca podem ser usados para consultas a termos múltiplos.

String de busca:

    <?php

    $hits = $index->find('+word1 author:word2 -word3');

    ?>

- '+' especifica um termo obrigatório.
- '-' especifica um termo rejeitado.
- 'campo:' especifica um campo específico para busca. Se for omitido a pesquisa utilizará o campo de conteúdo.

or

Construção da pesquisa via API:

    <?php

        $query = new Zend_Search_Lucene_Search_Query_MultiTerm();

        $query->addTerm(new Zend_Search_Lucene_Index_Term('word1'), true);
        $query->addTerm(new Zend_Search_Lucene_Index_Term('word2'), null);
        $query->addTerm(new Zend_Search_Lucene_Index_Term('word3'), false);

        $hits  = $index->find($query);

    ?>

O array `$signs` pode conter informações sobre o tipo de termo pesquisado:

- true define um termo como necessário.
- false define um termo como proibido.
- null define to define neither required, nor prohibited term.

### 12.4.3. Consulta por Frase

São indicadas para pequisas em frases.

Phrase Queries are very flexible and allow to search exact phrases as well as sloppy phrases. Exact phrases can also contain gaps or terms in the same places. (It can be generated by Analyser for different purposes. Ex. term can be duplicated to increase term weight or several synonyms can be placed into one position). According to this phrase queries can be constructed only by API now:

Consultas por frase são muito flexíveis e permitem tanto a busca pela frase exata quanto a por fragmentos da frase.

    <?php
    $query1 = new Zend_Search_Lucene_Search_Query_Phrase();

    // Add 'word1' at 0 relative position.
    $query1->addTerm(new Zend_Search_Lucene_Index_Term('word1'));

    // Add 'word2' at 1 relative position.
    $query1->addTerm(new Zend_Search_Lucene_Index_Term('word2'));

    // Add 'word3' at 3 relative position.
    $query1->addTerm(new Zend_Search_Lucene_Index_Term('word3'), 3);

    ...

    $query2 = new Zend_Search_Lucene_Search_Query_Phrase(
                    array('word1', 'word2', 'word3'), array(0,1,3));

    ...

    // Query without a gap.
    $query3 = new Zend_Search_Lucene_Search_Query_Phrase(
                    array('word1', 'word2', 'word3'));

    ...

    $query4 = new Zend_Search_Lucene_Search_Query_Phrase(
                    array('word1', 'word2'), array(0,1), 'annotation');

    ?>

A pesquisa por frase pode ser construida de uma única vez com um construtor de classe ou passo a passo com o método `Zend_Search_Lucene_Search_Query_Phrase::addTerm()`.

Zend_Search_Lucene_Search_Query_Phrase::addTerm()

O construtor da classe Zend_Search_Lucene_Search_Query_Phrase aceita três argumentos opcionais:

    Zend_Search_Lucene_Search_Query_Phrase([array $terms[, array $offsets[, string $field]]]);

`$terms` é um array de strings, contendo um conjunto de termos de frase. Se omitido ou igualado a um valor nulo, resulta na construção de um objeto consulta vazio.

`$offsets` é um array de inteiros, contendo deslocamentos de termos em uma frase. Se omitido ou igualado a um valor nulo fará com que as posições dos termos no array fiquem na forma `array(0, 1, 2, 3, ...)`.

`$field` é uma string, que indica o campo do documento que será pesquisado. Se for omitido ou igualado a um valor nulo, restringirá a pesquisa ao campo "default". Esta versão do Zend_Search_Lucene trata os campos 'contents' como defaults, mas planejamos alterar este comportamento em versões futuras para considerar qualquer campo.

Dess modo:

    $query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'framework'));

irá pesquisar pela frase "zend framework".

    <$query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'download'), array(0, 2));

irá pesquisar pela frase 'zend ????? download' e retornar 'zend platform download', 'zend studio download', 'zend core download', 'zend framework download' e por aí vai.

    $query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'framework'), null, 'title');

irá pesquisar pela frase 'zend framework' em um campo 'title'.

`Zend_Search_Lucene_Search_Query_Phrase::addTerm()` possui dois argumentos. O objeto `Zend_Search_Lucene_Index_Term` é requerido mas a posição é opcional:

    Zend_Search_Lucene_Search_Query_Phrase::addTerm(Zend_Search_Lucene_Index_Term $term[, integer $position]);

`$term` descreve o próximo termo na frase. Ele deve indicar o mesmo campo que os termos anteriores, senão, uma irá disparar uma exceção.

`$position` indica a posição do termo.

Desse modo:

    $query = new Zend_Search_Lucene_Search_Query_Phrase();
    $query->addTerm(new Zend_Search_Lucene_Index_Term('zend'));
    $query->addTerm(new Zend_Search_Lucene_Index_Term('framework'));

irá pesquisar pela frase 'zend framework'.

    $query = new Zend_Search_Lucene_Search_Query_Phrase();
    $query->addTerm(new Zend_Search_Lucene_Index_Term('zend'), 0);
    $query->addTerm(new Zend_Search_Lucene_Index_Term('framework'), 2);

irá pesquisar pela frase 'zend ????? download' e retornar 'zend platform download', 'zend studio download', 'zend core download', 'zend framework download' e por aí vai.

    $query = new Zend_Search_Lucene_Search_Query_Phrase();
    $query->addTerm(new Zend_Search_Lucene_Index_Term('zend', 'title'));
    $query->addTerm(new Zend_Search_Lucene_Index_Term('framework', 'title'));

irá pesquisar pela frase 'zend framework' em um campo 'title'.

O fator de aproximação ("Sloop factor") determina o número de palavras permitidas entre as palavras da frase pesquisada. Se for zero, então a busca será pela frase exata. Para valores maiores ele funciona bem com os operadores WITHIN ou NEAR.

Ele é de fato uma medida de distância, onde as unidades correspondem aos deslocamentos dos termos na frase consultada. Por exemplo, para alterar a ordem de duas palavras são necessários dois movimentos (o primeiro move uma palavra para a frente da outra), então para permitir a reordenação de uma frase, o fator deve ser de pelo menos duas unidades.

More exact matches are scored higher than sloppier matches, thus search results are sorted by exactness. The slop is zero by default, requiring exact matches.

Comparações mais exatas exatas possuem pontuações mais altas que o fator de aproximação, dessa forma os resultados são ordenados por exatidão. O fator de aproximação será zero por padrão, determinando comparações exatas.

O fator de aproximação pode ser estabelecido após a criação da consulta:

    <?php

    // Query without a gap.
    $query = new Zend_Search_Lucene_Search_Query_Phrase(array('word1', 'word2'));

    // Search for 'word1 word2', 'word1 ... word2'
    $query->setSlop(1);
    $hits1 = $index->find($query);

    // Search for 'word1 word2', 'word1 ... word2',
    // 'word1 ... ... word2', 'word2 word1'
    $query->setSlop(2);
    $hits2 = $index->find($query);

    ?>

Anterior | Acima | Próxima
12.3. Pesquisando em um Índice | Principal | 12.5. Conjuntos de Caracteres