Opciones de consulta y de ordenamiento

Cuando llamas al método search() mediante una cadena de consulta independiente, los resultados se muestran de acuerdo con las opciones de consulta predeterminadas:

  • Los documentos se muestran en un orden de clasificación descendiente.
  • Se muestran los documentos en grupos de 20 por vez.
  • Los documentos recuperados contienen todos sus campos originales

Puedes usar una instancia de la clase Query como el argumento para search() a fin de cambiar estas opciones.

La clase Query te permite especificar cuántos documentos se muestran a la vez. También permite personalizar los contenidos de los documentos recuperados. Puedes pedir solo documentos identificadores o solicitar que los documentos contengan solo un subconjunto de sus campos. También puedes crear campos personalizados en los documentos recuperados: fragmentos (recortes de campos de texto que muestran el texto que rodea a una string coincidente) y expresiones de campo (campos con valores derivados de otros campos del documento).

Además de las opciones de consulta, la clase Query puede incluir una instancia de la clase SortOptions. Con las opciones de orden de esta clase, puedes cambiar el orden y ordenar los resultados según diferentes claves.

Cómo realizar una búsqueda con la clase Query

Cuando realizas una búsqueda con una instancia de la clase Query, debes construir una instancia de la clase a través de varios pasos. Este es el orden general:

  1. Crea una string de consulta.
  2. Crea SortOptions si es necesaria.
  3. Crea QueryOptions.
  4. Crear un objeto Query que incluya la string de consulta y las QueryOptions (opcionales).
  5. Llama al método de búsqueda en el objeto Query.

Las distintas opciones de consulta y orden se especifican mediante un llamado a los métodos set en las instancias de las clases QueryOptions.Builder y SortOptions.Builder, como en este ejemplo:

try {
  // Build the SortOptions with 2 sort keys
  SortOptions sortOptions =
      SortOptions.newBuilder()
          .addSortExpression(
              SortExpression.newBuilder()
                  .setExpression("price")
                  .setDirection(SortExpression.SortDirection.DESCENDING)
                  .setDefaultValueNumeric(0))
          .addSortExpression(
              SortExpression.newBuilder()
                  .setExpression("brand")
                  .setDirection(SortExpression.SortDirection.DESCENDING)
                  .setDefaultValue(""))
          .setLimit(1000)
          .build();

  // Build the QueryOptions
  QueryOptions options =
      QueryOptions.newBuilder()
          .setLimit(25)
          .setFieldsToReturn("model", "price", "description")
          .setSortOptions(sortOptions)
          .build();

  // A query string
  String queryString = "product: coffee roaster AND price < 500";

  //  Build the Query and run the search
  Query query = Query.newBuilder().setOptions(options).build(queryString);
  IndexSpec indexSpec = IndexSpec.newBuilder().setName(indexName).build();
  Index index = SearchServiceFactory.getSearchService().getIndex(indexSpec);
  Results<ScoredDocument> result = index.search(query);
  return result;
} catch (SearchException e) {
  // handle exception...
}

QueryOptions

Debes usar QueryOptions.Builder para configurar las opciones de consulta. No tienes acceso directo a estas propiedades.

Estas propiedades controlan cuántos resultados mostrar y en qué orden. Las opciones de offset y cursor, que son mutuamente excluyentes, son compatibles con la paginación. Especifican qué documentos seleccionados mostrar en los resultados.

Propiedad Descripción Predeterminado Máximo
Limit El máximo número de documentos que se muestran en los resultados. 20 1000
NumberFoundAccuracy Esta propiedad determina la exactitud del resultado que muestra Results.getNumberFound(). Establece un límite de coincidencias que se cuentan realmente, y detiene la búsqueda cuando se alcanza el límite.

Si la cantidad de coincidencias en el índice es menor o igual que el límite, el conteo que se muestra es exacto. Si no, el conteo es una estimación basada en las coincidencias que se encontraron y en el tamaño y estructura del índice. Ten en cuenta que establecer un valor alto para esta propiedad puede afectar la complejidad de la búsqueda y producir tiempos de espera.
Si no se especifica, la precisión se establece en el mismo valor que Limit. 25000
Offset El offset del primer documento en los resultados que se muestran. 0. Los resultados incluirán todos los documentos que coincidan (hasta llegar al límite). 1,000
Cursor Puede usarse un cursor en lugar de un offset para recuperar grupos de documentos en un orden determinado. El cursor se actualiza a medida que entra y sale de consultas consecutivas, lo que permite que cada nueva búsqueda se continúe desde el final de la anterior. El cursor y el offset se explican en la página Administrar resultados. Nulo. Los resultados incluirán todos los documentos que coincidan (hasta llegar al límite). -
SortOptions Establece un objeto SortOptions para controlar el orden de los resultados de la búsqueda. Una instancia de SortOptions tiene su propio conjunto de propiedades, que se describen a continuación. Nulo. Ordenar por clasificación descendiente de documentos. -

Estas propiedades controlan qué campos de los documentos aparecen en los resultados.

Propiedad Descripción Predeterminado
ReturningIdsOnly Se establece en True o False. Cuando se establece en True, los documentos que se muestran en los resultados solo contienen ID, sin campos. False (muestra todos los campos).
FieldsToReturn Especifica qué campos del documento se incluyen en los resultados. Pueden especificarse no más de 100 campos. Mostrar todos los campos de documentos (hasta 100 campos).
ExpressionsToReturn Expresiones de campo que describen campos calculados que se agregan a cada documento que se muestra en los resultados de la búsqueda. Estos campos se agregan a la propiedad de expresiones del documento. Este valor de campo se especifica escribiendo una expresión que puede incluir uno o más campos de documentos. Ninguno
FieldsToSnippet Lista de nombres de campos de texto. Se genera un fragmento para cada campo. Este es un campo calculado que se agrega a la propiedad de expresiones de los documentos en los resultados de la búsqueda. El campo del fragmento tiene el mismo nombre que su campo de origen.

De forma implícita, esta opción usa la función de fragmento con solo dos argumentos y crea un fragmento con una string coincidente como máximo, en función de la misma string de consulta que usó la búsqueda a fin de recuperar los resultados: snippet("query-string", field-name).

También puedes crear fragmentos personalizados con la opción ExpressionsToReturn. Para ello, agrega una expresión de campo que llame de forma explícita a la función de fragmento.
Ninguno

SortOptions

Las propiedades de SortOptions controlan el orden y la puntuación de los resultados de la búsqueda. Debes usar SortOptions.Builder para configurar las opciones de orden. No tienes acceso directo a estas propiedades.

Las propiedades de SortOptions controlan el orden y la puntuación de los resultados de la búsqueda.

Propiedad Descripción Predeterminado
SortExpressions Es una lista de SortExpressions que representa un orden multidimensional de los documentos. Ninguno
MatchScorer Es un objeto MatchScorer opcional. Cuando está presente, esta propiedad hace que los documentos se puntúen de acuerdo con la frecuencia del término de búsqueda. La puntuación estará disponible como el campo _score. Puntuar documentos puede ser costoso (tanto en operaciones facturables como en tiempo de ejecución) y puede ralentizar tus búsquedas. Usa la puntuación con moderación. Ninguno
Limit Número máximo de objetos que se ordenan o puntúan. No puede ser mayor a 10,000. 1,000

Ordenar en varias claves

Puedes ordenar los resultados de la búsqueda en múltiples claves de orden. Cada clave puede ser un simple nombre de campo, o un valor que se calcula en varios campos. Ten en cuenta que el término “expresión” se usa con varios significados cuando nos referimos a las opciones de orden: el SortOption en sí tiene un atributo de expresiones. Este atributo es una lista de objetos SortExpression que corresponden a claves de orden. Por último, cada objeto SortExpression contiene un atributo de expresión que especifica cómo calcular el valor de la clave de orden. Esta expresión se construye de acuerdo con las reglas de la sección siguiente.

Un SortExpression también define la dirección del orden y un valor de clave predeterminado a fin de usarse si no se puede calcular la expresión para un documento determinado. A continuación, puedes ver la lista completa de propiedades:

Propiedad Descripción Predeterminado
Expression Una expresión que se evalúa cuando se ordenan los resultados para cada documento que coincide. Ninguno
Direction La dirección para ordenar los resultados de la búsqueda, puede ser ASCENDING o DESCENDING. DESCENDING
DefaultValue
DefaultValueDate
DefaultValueNumber
El valor predeterminado de la expresión, si no hay ningún campo presente y no se puede calcular para un documento determinado. Debe especificarse un valor de texto para los órdenes de texto. Debe especificarse un valor numérico para los órdenes numéricos. Ninguno

Ordenar en campos de valores múltiples

Cuando ordenas en un campo con varios valores de un tipo particular, solo se usa el primer valor asignado al campo. Por ejemplo, considera dos documentos, DocA y DocB, que tienen un campo de texto llamado “color”. Se asignan dos valores al campo de "color" de DocA en el orden (rojo, azul), y dos valores a DocB en el orden (verde, rojo). Cuando ordenas y especificas el campo de texto “color”, DocA se ordena con el valor “rojo” y DocB con el valor “verde”. No se usan los otros valores de campo en el orden.

Ordenar o no ordenar

Si no especificas ninguna opción de orden, los resultados de la búsqueda se muestran automáticamente por orden de clasificación descendiente. No hay un límite para el número de documentos que se muestran en este caso. Si especificas opciones de orden, el orden se realiza después de que se seleccionan los documentos que coinciden. Hay una propiedad explícita, "SortOptions.limit", que controla el tamaño del orden. No podrás ordenar más de 10,000 documentos; el tamaño predeterminado es 1,000. Si hay más documentos que coinciden que el número especificado en "SortOptions.limit", la búsqueda solo recupera, ordena y muestra esa cantidad limitada. Se seleccionan los documentos para ordenar de la lista de todos los documentos que coinciden, que está ordenada por clasificación descendiente. Es posible que una consulta seleccione más documentos que coinciden de los que puedes ordenar. Si usas opciones de orden y es importante que recuperes todos los documentos que coinciden, debes intentar asegurarte de que tu búsqueda no muestre más resultados que los que puedes ordenar.

Escritura de expresiones

Las expresiones se usan para definir expresiones de campo (lo que se configura en “QueryOptions”) y para ordenar las expresiones (lo que se configura en las SortOptions). Se escriben como strings:

"price * quantity"
"(men + women)/2"
"min(daily_use, 10) * rate"
"snippet('rose', flower, 120)"

Las expresiones que incluyen campos de número pueden usar los operadores aritméticos (+, -, *, /) y las funciones numéricas incorporadas detalladas a continuación. Las expresiones que incluyen campos de puntos geográficos pueden usar las funciones de punto geográfico y distancia. Las expresiones para campos de texto y HTML pueden usar la función de fragmento.

Las expresiones también pueden incluir estos términos especiales:

Término Descripción
_rank La propiedad de clasificación. Se puede usar en expresiones de campo y expresiones de orden.
_score Es la puntuación asignada a un documento cuando incluyes MatchScorer en SortOptions. Este término solo puede aparecer en expresiones de orden; no puede usarse en expresiones de campo.

Funciones numéricas

Las expresiones que definen los valores numéricos para FieldExpressions y SortExpressions pueden usar las siguientes funciones integradas. Los argumentos deben ser números, nombres de campos o expresiones que usen números o nombres de campos.

Función Descripción Ejemplo
max Muestra el mayor de sus argumentos. max(recommended_retail_price, discount_price, wholesale_price)
min Muestra el menor de sus argumentos. min(height, width, length)
log Muestra el algoritmo natural. log(x)
abs Muestra el valor absoluto. abs(x)
pow Toma dos argumentos numéricos. La llamada pow(x, y) calcula el valor de x elevado a la potencia y. pow(x, 2)
count Toma un nombre de campo de su argumento. Muestra el número de campos en el documento con ese nombre. No olvides que un documento puede contener varios campos de tipos diferentes con el mismo nombre. Nota: count solo se puede usar en FieldExpressions. No puede aparecer en SortExpressions. count(user)

Funciones de puntos geográficos

Estas funciones pueden usarse para expresiones que incluyen campos de puntos geográficos.

Función Descripción Ejemplo
geopoint Define un punto geográfico con una latitud y longitud determinadas. geopoint(-31.3, 151.4)
distance Calcula la distancia en metros entre dos puntos geográficos. Ten en cuenta que cualquiera de los dos argumentos puede ser el nombre de un campo de punto geográfico o una invocación de la función de punto geográfico. Sin embargo, solo un argumento puede ser un nombre de campo. distance(geopoint(23, 134), store_location)

Fragmentos

Un fragmento es un recorte de un campo de texto que coincide con una string de consulta y abarca el texto que lo rodea. Los fragmentos se crean mediante una llamada a la función snippet:

snippet(query, body, [max_chars])

query
Una string de consulta entre comillas que especifica el texto que debe encontrarse en el campo.
body
El nombre de un campo de texto, HTML o atómico.
max_chars
La cantidad máxima de caracteres que se pueden mostrar en el fragmento. Este argumento es opcional, la cantidad predeterminada es de 160 caracteres.

La función muestra una string HTML. La string contiene un fragmento del valor del campo del cuerpo, con el texto que coincidió con la consulta en negrita.