> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Lenguaje de consulta

> Lenguaje de consulta XML para scripts de extracción de FlexiCapture: cree consultas Contain con elementos Required, Optional y Except, distancias y búsqueda difusa.

Una consulta especifica qué palabras o combinaciones de palabras debe contener un documento. El lenguaje de consulta que usan los scripts de extracción se basa en XML.

<div id="basic-query-structure">
  ## Estructura básica de la consulta
</div>

Una consulta sencilla tiene este aspecto:

```xml theme={null}
<Request>
    <Query>
        <Contain>
            <Required>
                <Form><Text>first</Text></Form>
            </Required>
            <Optional>
                <Form><Text>second</Text></Form>
            </Optional>
            <Except>
                <Query>
                    <Contain>
                        <Required>
                            <Form><Text>third</Text></Form>
                        </Required>
                        <Optional>
                            <Form><Text>fourth</Text></Form>
                        </Optional>
                    </Contain>
                </Query>
            </Except>
        </Contain>
    </Query>
</Request>
```

Los siguientes elementos componen una consulta:

| Elemento    | Descripción                                                                                                                                                                                                                                               |
| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `<Request>` | Elemento raíz de una consulta.                                                                                                                                                                                                                            |
| `<Query>`   | Consulta básica. Contiene un árbol de consulta que especifica las condiciones que debe cumplir la combinación de palabras. Una consulta básica puede formar parte de una combinación de formas de palabra en una consulta de nivel superior. Obligatorio. |
| `<Contain>` | Especifica qué palabras o combinaciones de palabras debe contener un documento. Una consulta solo puede tener un elemento `<Contain>`. Obligatorio.                                                                                                       |

El elemento `<Contain>` puede incluir cualquier número de los siguientes elementos, en cualquier orden:

| Elemento     | Descripción                                                                                               |
| ------------ | --------------------------------------------------------------------------------------------------------- |
| `<Required>` | Especifica una forma de palabra o subconsulta que una combinación de palabras debe contener. Opcional.    |
| `<Optional>` | Especifica una forma de palabra o subconsulta que una combinación de palabras puede contener. Opcional.   |
| `<Except>`   | Especifica una forma de palabra o subconsulta que una combinación de palabras no debe contener. Opcional. |

Cada uno de estos elementos debe contener uno de los siguientes:

| Elemento  | Descripción                                                                                             |
| --------- | ------------------------------------------------------------------------------------------------------- |
| `<Query>` | Especifica si una cadena de formas de palabra debe incluirse o excluirse de la combinación de palabras. |
| `<Form>`  | Especifica si una forma de palabra debe incluirse o excluirse de una combinación de palabras.           |

<Note>
  El elemento `<Contain>` debe contener al menos un elemento `<Required>` o `<Optional>`.
</Note>

<div id="attributes-of-the-contain-element">
  ## Atributos del elemento Contain
</div>

Se pueden especificar restricciones adicionales para una combinación de formas de palabra en los atributos de la etiqueta `<Contain>`.

<div id="mincount-attribute">
  ### Atributo MinCount
</div>

Especifique el número mínimo de elementos de una combinación de formas de palabra en un atributo `MinCount`. Cada elemento es una forma de palabra o una cadena de formas de palabra devuelta por la subconsulta. El valor predeterminado del atributo es `1`. El valor de este parámetro no debe ser mayor que el número total de elementos `<Required>` y `<Optional>` de la combinación de formas de palabra.

Este parámetro resulta útil cuando una combinación de formas de palabra contiene uno o varios elementos `<Optional>`.

La siguiente consulta busca el primer o el segundo parámetro:

```xml theme={null}
<Query>
    <Contain>
        <Optional>
            <Form><Text>first</Text></Form>
        </Optional>
        <Optional>
            <Form><Text>second</Text></Form>
        </Optional>
    </Contain>
</Query>
```

La siguiente consulta encuentra al menos tres de las cuatro palabras especificadas en ella, dos de las cuales son obligatorias:

```xml theme={null}
<Query>
    <Contain MinCount="3">
        <Optional>
            <Form><Text>US</Text></Form>
        </Optional>
        <Required>
            <Form><Text>President</Text></Form>
        </Required>
        <Optional>
            <Form><Text>Barack</Text></Form>
        </Optional>
        <Required>
            <Form><Text>Obama</Text></Form>
        </Required>
    </Contain>
</Query>
```

Esta consulta encuentra las siguientes frases: “US President Barack Obama”, “President Barack Obama” y “US President Obama.”

<div id="keeporder-attribute">
  ### Atributo KeepOrder
</div>

Para especificar un orden fijo de los elementos en una combinación de formas de palabra, use el atributo `KeepOrder` de tipo Boolean. El valor predeterminado del atributo es `false`.

La siguiente consulta especifica que el orden de los elementos es fijo:

```xml theme={null}
<Query>
    <Contain KeepOrder="true">
        <Required>
            <Form><Text>first</Text></Form>
        </Required>
        <Required>
            <Form><Text>second</Text></Form>
        </Required>
        <Required>
            <Form><Text>third</Text></Form>
        </Required>
    </Contain>
</Query>
```

La combinación “primera tercera segunda tercera” no coincidirá con la consulta, aunque esta sí contiene una secuencia de palabras en el orden requerido.

`KeepOrder` también se aplica a cualquier elemento `<Except>`. Las palabras correspondientes a los elementos `<Except>` de una consulta no deben aparecer entre las palabras que esos elementos separan en la consulta. Sin embargo, pueden aparecer en cualquier otra posición fuera de las secuencias de consulta con orden fijo.

Por ejemplo, si modifica la consulta anterior colocando la forma de palabra “segunda” en un elemento `<Except>` en lugar de `<Required>`, un documento que contenga la combinación de formas de palabra “primera tercera segunda” coincidirá con la consulta (pero la forma de palabra “segunda” no se incluirá en el resultado). Si después elimina el atributo `KeepOrder`, un documento que contenga la combinación de formas de palabra “primera tercera segunda” no se incluirá en el resultado, porque la forma de palabra “segunda” no debe aparecer en ningún lugar del texto de un documento.

<div id="mindistance-and-maxdistance-attributes">
  ### Atributos MinDistance y MaxDistance
</div>

Los atributos `MinDistance` y `MaxDistance` especifican las distancias mínima y máxima entre palabras en una consulta. Estos atributos no tienen valores predeterminados. Si no se especifica alguno de estos dos atributos, no se aplica ninguna limitación de distancia.

La distancia entre palabras se mide en palabras y se calcula como la diferencia entre las posiciones de las dos palabras correspondientes. La distancia entre dos palabras contiguas es 1, por lo que el valor mínimo de cualquiera de estos atributos es 1. `MaxDistance` debe ser mayor o igual que `MinDistance`.

La distancia entre dos cadenas de palabras se calcula de la siguiente manera. Si las cadenas no se superponen, la distancia se calcula como la diferencia entre la posición de la palabra situada más a la izquierda de la cadena de la derecha y la posición de la palabra situada más a la derecha de la cadena de la izquierda. Si las cadenas se superponen, se considera que la distancia es 0.

Por ejemplo, en la frase “The quick brown fox jumped over the lazy dog,” la distancia entre las cadenas “quick fox” y “lazy dog” es 4, y la distancia entre las cadenas “quick fox” y “brown lazy dog” es 0.

Para los elementos `<Except>`, la distancia entre palabras se calcula de la siguiente manera:

* Si `KeepOrder="true"`, la palabra no debe aparecer dentro de la distancia especificada respecto a las palabras vecinas de la cadena (es decir, las palabras entre las que aparece en la consulta). Al mismo tiempo, la distancia entre los elementos vecinos del elemento `<Except>` debe estar dentro del rango especificado.
* Si `KeepOrder="false"`, la palabra no debe aparecer dentro de la distancia especificada respecto a ninguna otra palabra de la cadena.

La siguiente consulta usa `KeepOrder="true"` y `MaxDistance="2"`:

```xml theme={null}
<Query>
    <Contain KeepOrder="true" MaxDistance="2">
        <Required>
            <Form><Text>sodium /Text></Form>
        </Required>
        <Except>
            <Form><Text>tetraborate</Text></Form>
        </Except>
        <Optional>
            <Form><Text>carborate</Text></Form>
        </Optional>
        <Optional>
            <Form><Text>sulfate</Text></Form>
        </Optional>
        <Required>
            <Form><Text>decahydrate</Text></Form>
        </Required>
    </Contain>
</Query>
```

Esta consulta encuentra frases como “sodium carborate decahydrate” y “sodium sulfate decahydrate”.

La siguiente consulta usa `KeepOrder="false"` y `MaxDistance="2"`:

```xml theme={null}
<Query>
    <Contain KeepOrder="false" MaxDistance="2">
        <Required>
            <Form><Text>sodium /Text></Form>
        </Required>
        <Except>
            <Form><Text>tetraborate</Text></Form>
        </Except>
        <Optional>
            <Form><Text>carborate</Text></Form>
        </Optional>
        <Optional>
            <Form><Text>sulfate</Text></Form>
        </Optional>
        <Required>
            <Form><Text>decahydrate</Text></Form>
        </Required>
    </Contain>
</Query>
```

Esta consulta encuentra solo “sulfato de sodio decahidratado”, porque la palabra "tetraborato" está en las etiquetas `<Except>` y la distancia máxima entre "tetraborato" y “sodio” es de dos palabras.

<div id="form-element">
  ## Elemento Form
</div>

La consulta de una forma de palabra se especifica mediante un elemento `<Form>`. Este elemento puede contener los siguientes elementos:

* `<Attributes>` — Elemento opcional que contiene una consulta para los atributos de una forma de palabra. Para obtener más información, consulte [cuándo usar scripts de extracción](/es/flexi-capture/nlp-extraction-scripts).
* `<Text>` — Elemento opcional que contiene el texto Unicode de una forma de palabra. Si no se especifica ningún texto, cualquier palabra que coincida con la consulta de atributos coincidirá con la consulta. En este caso, la consulta de atributos es obligatoria.

Se pueden especificar condiciones de búsqueda adicionales para una forma de palabra en los atributos de la etiqueta `<Form>`.

<div id="searchtype-attribute">
  ### Atributo SearchType
</div>

El tipo de búsqueda de forma de palabra puede especificarse en el atributo `SearchType` de la etiqueta `<Form>`. Este atributo puede tener los siguientes valores:

| Valor               | Descripción                                                                                                                                                                                                                                                                                                                                                                    |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `AllFormsSearch`    | Busca todas las formas de la palabra especificada.                                                                                                                                                                                                                                                                                                                             |
| `ExactSearch`       | Busca solo la forma especificada de la palabra.                                                                                                                                                                                                                                                                                                                                |
| `PrefixSearch`      | Busca cualquier forma de palabra con el prefijo especificado.                                                                                                                                                                                                                                                                                                                  |
| `FuzzySearch`       | Realiza una búsqueda difusa de la palabra especificada. Resulta útil si sus textos pueden contener errores de Reconocimiento óptico de caracteres (OCR) y `ExactSearch` no funciona. Solo puede usarse con palabras de al menos 3 caracteres. Para palabras de 3 a 5 caracteres, permite 1 error de OCR; para palabras de más de 5 caracteres, permite hasta 2 errores de OCR. |
| `FuzzyPrefixSearch` | Realiza una búsqueda difusa de cualquier palabra con el prefijo especificado.                                                                                                                                                                                                                                                                                                  |

El atributo `SearchType` es opcional y, de forma predeterminada, se establece en `AllFormsSearch`.

<div id="casesensitive-attribute">
  ### Atributo CaseSensitive
</div>

Para las búsquedas con distinción entre mayúsculas y minúsculas, puede usarse el atributo `CaseSensitive` de la etiqueta `<Form>`. Este atributo es opcional y, de manera predeterminada, se establece en `false`.

La siguiente consulta usa los atributos `SearchType` y `CaseSensitive` de la etiqueta `<Form>`:

```xml theme={null}
<Query>
    <Contain KeepOrder="true">
        <Required>
            <Form SearchType="ExactSearch" CaseSensitive="true">
                <Text>WHO</Text>
            </Form>
        </Required>
    </Contain>
</Query>
```

Esta consulta busca el acrónimo WHO exactamente con esta forma, lo que ayuda a evitar una gran cantidad de resultados redundantes que contienen “who”, “whom” o “whose”.

<div id="attributes-element">
  ## Elemento Attributes
</div>

Una consulta de atributos de forma de palabra es una expresión lógica construida con los operadores AND, OR y NOT. NOT es un operador unario, mientras que AND y OR son *n*-arios. Los operandos de esta expresión lógica son valores de tipo Bool. Esta expresión lógica se escribe en forma de árbol. El resultado de la consulta son las formas de palabra del texto de un documento que cumplen esta expresión lógica.

Para obtener atributos de forma de palabra, use un elemento `<Attributes>`. Este elemento puede contener los siguientes elementos:

| Elemento      | Descripción                                                                                     |
| ------------- | ----------------------------------------------------------------------------------------------- |
| `<Attribute>` | Contiene el texto del atributo de palabra requerido. Es una hoja del árbol de expresión lógica. |
| `<Or>`        | El operador OR. Un nodo del árbol.                                                              |
| `<And>`       | El operador AND. Un nodo del árbol.                                                             |
| `<Not>`       | El operador NOT. Un nodo del árbol.                                                             |

El elemento `<Not>` se construye de la misma manera que el elemento `<Attributes>` y solo puede contener uno de estos elementos.

Los elementos `<Or>` y `<And>` deben contener al menos dos de estos elementos.

La etiqueta `<Attribute>` tiene un atributo `SearchType` opcional que especifica el tipo de búsqueda de atributos. Este atributo puede tener los siguientes valores:

* `ExactSearch` — Busca el atributo exactamente en la forma especificada en la consulta.
* `PrefixSearch` — Busca atributos que comiencen con el texto especificado.

La búsqueda de atributos siempre distingue entre mayúsculas y minúsculas. El atributo `SearchType` se establece en `ExactSearch` de forma predeterminada.

Suponga que tiene un documento en el que ya ha identificado:

* objetos NER, llamando a la función `ExtractNerObjects`
* formas de palabra de un diccionario de usuario llamado `dictionary`, llamando a la función `ExtractWordsFromUserDictionary`
* todos los objetos que satisfacen una expresión regular pasada como parámetro, llamando a la función `ExtractRegularExpression`

Suponga que la colección resultante de estos objetos se llama `regExp`.

<Note>
  El nombre de la colección se puede usar en consultas XML realizadas en el documento indexado. Se puede acceder a la propia colección resultante mediante su nombre.
</Note>

Una consulta de atributos de forma de palabra tendría este aspecto:

```xml theme={null}
<Query>
    <Contain>
        <Required>
            <Form>
                <Attributes>
                    <Attribute>regExp1</Attribute>
                </Attributes>
            </Form>
        </Required>
        <Required>
            <Form>
                <Attributes>
                    <And>
                        <Attribute>NerOrg1</Attribute>
                        <Not>
                            <Attribute> dictionary1</Attribute>
                        </Not>
                    </And>
                </Attributes>
            </Form>
        </Required>
    </Contain>
</Query>
```

Esta consulta busca una frase de dos palabras, donde la primera palabra debe coincidir con la expresión regular especificada y la segunda debe ser un nombre permitido de una organización.

Los dígitos que aparecen después de los nombres de los atributos identifican las palabras requeridas en los objetos detectados de varias palabras que se han indexado con los atributos correspondientes. Por ejemplo, una expresión regular llamada `date` puede encontrar una fecha con el formato “31 de mayo de 2019”. Entonces, `date1` corresponde a la palabra “mayo”, `date2` corresponde a “31” y `date3` corresponde a “2019”.

<div id="formset-element">
  ## Elemento FormSet
</div>

Una consulta para varias formas de palabra se especifica mediante un elemento `<FormSet>`.

Este tipo de consulta combina varias consultas de una sola forma mediante OR. Equivale a una consulta `<Query>` en la que todas las subconsultas son consultas opcionales de formas de palabra.

Sin embargo, en una consulta `<FormSet>`, puede especificar una consulta de atributos común a todas las formas. Esto permite realizar búsquedas más eficientes cuando se usa `ExactSearch` para encontrar todas las formas de palabra, existe una consulta de atributos para cada forma y todas esas consultas de atributos comparten algún fragmento común.

Un elemento `<FormSet>` contiene los siguientes elementos:

* `<Attributes>` — Elemento opcional que contiene una consulta para los atributos de la forma. Esta consulta se combina con las consultas de atributos de la forma mediante AND.
* `<Form>` — Elemento obligatorio que contiene una consulta para una forma de palabra. Un elemento `<FormSet>` debe contener al menos un elemento `<Form>`.

## <a id="xml-parsing" />Consulta de ejemplo para extraer direcciones en XML

El resultado de una consulta de extracción de direcciones es una cadena de texto que contiene la primera palabra del país, la primera palabra de la calle, la primera palabra de la ciudad, la primera palabra del estado y la primera palabra del código postal (en ese orden, siempre que no estén separadas entre sí por más de 5 palabras).

Las palabras consecutivas que forman un componente (por ejemplo, el nombre de una calle) también se numeran en el índice, empezando por 1.

```javascript theme={null}
var xmlQuery = "<Request> \
<Query> \
     <Contain MaxDistance=\"5\" KeepOrder=\"true\"> \
          <Optional> \
               <Form><Attributes><Attribute>NerCountry1</Attribute></Attributes></Form> \
          </Optional> \
          <Optional> \
               <Form><Attributes><Attribute>NerStreet1</Attribute></Attributes></Form> \
          </Optional> \
          <Optional> \
               <Form><Attributes><Attribute>NerCity1</Attribute></Attributes></Form> \
          </Optional> \
          <Optional> \
               <Form><Attributes><Attribute>NerState1</Attribute></Attributes></Form> \
          </Optional> \
          <Required> \
               <Form><Attributes><Attribute>NerZipCode1</Attribute></Attributes></Form> \
          </Required> \
     </Contain> \
</Query> \
</Request>";
```

El resultado de una consulta para extraer direcciones se guarda en un campo repetible `xmlQueryResult`:

```javascript theme={null}
this.RunQueryAndSaveToField( xmlQuery, "query", "xmlQueryResult" );
```
