Opciones de consulta y ordenación

Cuando llamas al método search() usando solo una cadena de consulta, los resultados se devuelven según las opciones de consulta predeterminadas:

  • Los documentos se devuelven ordenados de mayor a menor según su rango.
  • Los documentos se devuelven en grupos de 20
  • Los documentos recuperados contienen todos sus campos originales

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

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

Además de las opciones de consulta, la clase Query también puede incluir una instancia de la clase SortOptions. Con las opciones de ordenación, puedes cambiar el orden y ordenar los resultados por varios criterios.

Buscar con la clase Query

Cuando buscas con una instancia de la clase Query, debes crear una instancia de la clase en varios pasos. Este es el orden general:

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

Las distintas opciones de consulta y ordenación se especifican llamando a métodos setter en 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

Para definir las opciones de consulta, debes usar QueryOptions.Builder. No tienes acceso directo a estas propiedades.

Estas propiedades controlan cuántos resultados se devuelven y en qué orden. Las opciones offset y cursor, que se excluyen mutuamente, admiten la paginación. Especifican qué documentos seleccionados se deben devolver en los resultados.

Propiedad Descripción Predeterminado Máximo
Limit Número máximo de documentos que se devolverán en los resultados. 20 1000
NumberFoundAccuracy Esta propiedad determina la precisión del resultado devuelto por Results.getNumberFound() . Define un límite para el número de coincidencias que se contabilizan y detiene la búsqueda cuando se alcanza el límite.

Si el número de coincidencias del índice es inferior o igual al límite, el recuento devuelto es exacto. De lo contrario, el recuento será una estimación basada en las coincidencias encontradas y en el tamaño y la estructura del índice. Ten en cuenta que, si asignas un valor alto a esta propiedad, puede verse afectada la complejidad de la operación de búsqueda y pueden producirse tiempos de espera.
Si no se especifica, la precisión se establece en el mismo valor que Limit. 25000
Offset Desplazamiento del primer documento de los resultados que se van a devolver. 0. Los resultados contendrán todos los documentos que coincidan (hasta el límite). 1000
Cursor Se puede usar un cursor en lugar de un desplazamiento para recuperar grupos de documentos en orden. Un cursor se actualiza a medida que se introduce y se saca de consultas consecutivas, lo que permite que cada nueva búsqueda continúe desde el final de la anterior. El cursor y el desplazamiento se explican en la página Gestionar resultados. Nulo. Los resultados contendrán todos los documentos que coincidan (hasta el límite). -
SortOptions Define un objeto SortOptions para controlar el orden de los resultados de búsqueda. Una instancia de SortOptions tiene su propio conjunto de propiedades, que se describen a continuación. Nulo. Ordenar por orden decreciente de la clasificación de los documentos. -

Estas propiedades controlan qué campos del documento aparecen en los resultados.

Propiedad Descripción Predeterminado
ReturningIdsOnly Su valor debe ser True o False. Cuando True, los documentos devueltos en los resultados solo contendrán IDs, no campos. False (devuelve todos los campos).
FieldsToReturn Especifica los campos del documento que se deben incluir en los resultados. No se pueden especificar más de 100 campos. Devuelve todos los campos del documento (hasta 100 campos).
ExpressionsToReturn Expresiones de campo que describen los campos calculados que se añaden a cada documento devuelto en los resultados de búsqueda. Estos campos se añaden a la propiedad expressions del documento. El valor del campo se especifica escribiendo una expresión que puede incluir uno o varios campos de documento. Ninguno
FieldsToSnippet Lista de nombres de campos de texto. Se genera un fragmento para cada campo. Se trata de un campo calculado que se añade a la propiedad expressions de los documentos de los resultados de búsqueda. El campo de fragmento tiene el mismo nombre que su campo de origen.

Esta opción usa implícitamente la función de fragmento con solo dos argumentos, lo que crea un fragmento con como máximo una cadena coincidente, basada en la misma cadena de consulta que la búsqueda usó para obtener los resultados: snippet("query-string", field-name).

También puede crear fragmentos personalizados con la opción ExpressionsToReturn añadiendo una expresión de campo que llame explícitamente a la función de fragmento.
Ninguno

SortOptions

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

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

Propiedad Descripción Predeterminado
SortExpressions Lista de SortExpressions que representa una ordenación multidimensional de documentos. Ninguno
MatchScorer Objeto MatchScorer opcional. Si está presente, los documentos se puntuará según la frecuencia del término de búsqueda. La puntuación estará disponible en el campo _score. Puntuarlos puede ser caro (tanto en operaciones facturables como en tiempo de ejecución) y ralentizar las búsquedas. Usa las puntuaciones con moderación. Ninguno
Limit Número máximo de objetos que se van a calificar u ordenar. No puede ser superior a 10.000. 1000

Ordenar por varias claves

Puedes ordenar los resultados de búsqueda por varias claves de ordenación. Cada clave puede ser un nombre de campo sencillo o un valor que se calcula a partir de varios campos. Ten en cuenta que el término "expresión" se usa con varios significados cuando se habla de opciones de orden: el SortOption en sí tiene un atributo expressions. Este atributo es una lista de objetos SortExpression que corresponden a claves de ordenación. Por último, cada objeto SortExpression contiene un atributo expression que especifica cómo calcular el valor de la clave de ordenación. Esta expresión se crea según las reglas de la sección siguiente.

Un SortExpression también define la dirección de la ordenación y un valor de clave predeterminado que se usará si no se puede calcular la expresión de un documento. Esta es la lista completa de propiedades:

Propiedad Descripción Predeterminado
Expression Una expresión que se evaluará al ordenar los resultados de cada documento coincidente. Ninguno
Direction Dirección en la que se ordenan los resultados de búsqueda. Puede ser ASCENDING o DESCENDING. DESCENDING
DefaultValue
DefaultValueDate
DefaultValueNumber
Valor predeterminado de la expresión si no hay ningún campo y no se puede calcular para un documento. Se debe especificar un valor de texto para las ordenaciones de texto. Se debe especificar un valor numérico para las ordenaciones numéricas. Ninguno

Ordenar por campos con varios valores

Cuando ordenas por un campo de varios valores de un tipo concreto, solo se usa el primer valor asignado al campo. Por ejemplo, supongamos que tienes dos documentos, DocA y DocB, que tienen un campo de texto llamado "color". Se asignan dos valores al campo "color" de DocA en el orden (rojo, azul) y dos valores a DocB en el orden (verde, rojo). Si ordenas los documentos por el campo de texto "color", el documento A se ordenará por el valor "rojo" y el documento B por el valor "verde". Los demás valores de los campos no se usan en la ordenación.

Ordenar o no ordenar

Si no especifica ninguna opción de orden, los resultados de búsqueda se devolverán automáticamente ordenados por rango descendente. En este caso, no hay límite en el número de documentos que se devuelven. Si especifica alguna opción de ordenación, esta se llevará a cabo después de seleccionar todos los documentos coincidentes. Hay una propiedad explícita, `SortOptions.limit`, que controla el tamaño de la ordenación. Nunca podrás ordenar más de 10.000 documentos. El valor predeterminado es 1000. Si hay más documentos que coinciden que el número especificado por `SortOptions.limit`, la búsqueda solo recupera, ordena y devuelve ese número limitado. Selecciona los documentos que se van a ordenar de la lista de todos los documentos coincidentes, que está ordenada de forma descendente según la clasificación. Es posible que una consulta seleccione más documentos coincidentes de los que puedes ordenar. Si usas opciones de ordenación y es importante recuperar todos los documentos coincidentes, debes intentar asegurarte de que tu consulta no devuelva más documentos de los que puedes ordenar.

Escribir expresiones

Las expresiones se usan para definir expresiones de campo (que se definen en `QueryOptions`) y expresiones de orden, que se definen en SortOptions. Se escriben como cadenas:

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

Las expresiones que incluyan campos de número pueden usar los operadores aritméticos (+, -, *, /) y las funciones numéricas integradas que se indican a continuación. Las expresiones que incluyan campos de tipo geopunto pueden usar las funciones geopunto y distancia. Las expresiones de los 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 rank de un documento. Se puede usar en expresiones de campo y de orden.
_score La puntuación asignada a un documento cuando incluyes un MatchScorer en el SortOptions. Este término solo puede aparecer en expresiones de ordenación; no se puede usar en expresiones de campo.

Funciones numéricas

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

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

Funciones de geopunto

Estas funciones se pueden usar en expresiones que incluyan campos de geopunto.

Función Descripción Ejemplo
geopoint Define un punto geográfico a partir de una latitud y una longitud. 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 geopunto o una invocación de la función geopunto. Sin embargo, solo un argumento puede ser un nombre de campo. distance(geopoint(23, 134), store_location)

Fragmentos

Un fragmento es un fragmento de un campo de texto que coincide con una cadena de consulta e incluye el texto circundante. Los fragmentos se crean llamando a la función snippet:

snippet(query, body, [max_chars])

query
Cadena de consulta entre comillas que especifica el texto que se va a buscar en el campo.
body
Nombre de un campo de texto, HTML o Atom.
max_chars
Número máximo de caracteres que se devolverán en el fragmento. Este argumento es opcional y su valor predeterminado es 160 caracteres.

La función devuelve una cadena HTML. La cadena contiene un fragmento del valor del campo body, con el texto que ha coincidido con la consulta en negrita.