Share via


Refinado de consultas en SharePoint

Aprenda a usar las características de refinamiento de consulta de SharePoint mediante programación cuando se trabaja con las consultas de búsqueda y resultados.

Puede usar las características de refinamiento de consulta para proporcionar a los usuarios finales las opciones de refinamiento que son relevantes para sus consultas. Estas características permiten que el usuario final profundizar en los resultados de búsqueda mediante el uso de datos de refinamiento calculadas para los resultados. Datos de refinamiento se calculan mediante el componente de índice, basándose en la agregación de estadísticas de la propiedad administrada para todos los resultados de una consulta de búsqueda.

Normalmente, se usa el refinamiento de consultas para metadatos asociados con los elementos indizados, como fecha de creación, el autor o tipos de archivo que aparecen en el elemento. Mediante el uso de las opciones de refinamiento, puede restringir la consulta para mostrar sólo los elementos creados durante un período de tiempo determinado o mostrar sólo los elementos de un tipo de archivo específico.

Usar refinadores en el modelo de objetos de consulta

Hay dos consultas implicadas en el refinamiento de consultas:

  1. Puede solicitar que se devuelva un conjunto de refinadores en los resultados de la búsqueda agregando una especificación de refinador a la consulta del usuario final. Una especificación de refinador es la entrada para la propiedad Refiners . Esta consulta se ejecuta en el índice de búsqueda. Los resultados de búsqueda se componen de resultados relevantes y datos de refinamiento.
  2. Puede usar los datos de refinamiento para explorar en profundidad los resultados de la búsqueda mediante la creación de una consulta refinada. Agregue la propiedad RefinementFilters a la consulta para que los resultados finales de la búsqueda cumplan los requisitos del texto de consulta original del usuario final y la opción de refinamiento seleccionada de los datos de refinamiento.

En las secciones siguientes se describen estos pasos con detalle y proporcionan ejemplos de código.

Agregar refinadores a la consulta del usuario final con especificaciones de refinador

Puede especificar los refinadores de consultas solicitados mediante la propiedad Refiners de la clase KeywordQuery . Use la siguiente sintaxis para especificar los refinadores de consulta solicitada:

<refiner>[,<refiner>]*

Cada refiner tiene el siguiente formato:

<refiner-name>[(parameter=value[,parameter=value]*)]?

Donde:

  • <refiner-name> es el nombre de la propiedad administrada asociada con el refinador. Esta propiedad administrada debe establecerse en Refinable o Sortable en el esquema de búsqueda.
  • La lista opcional de pares parameter=value especifica los valores de configuración no predeterminados para el refinador con nombre. Si un parámetro para un refinador no aparece dentro de los paréntesis, la configuración del esquema de búsqueda proporciona la configuración predeterminada. La tabla 1 se enumeran los valores posibles para los pares de parameter=value .

Nota:

Al especificar refinadores, el requisito mínimo es especificar un refiner-name, que es una propiedad administrada.

Ejemplo

Refiners = "FileType"

O bien, también puede usar la sintaxis avanzada para ajustar la configuración de refinador:

Refiners = "FileType,Write(discretize=manual/2013-01-01/2013-08-22/2013-09-15/2013-09-21/2013-09-22),companies"

Tabla 1: Lista de parámetros para refinadores

Parámetro Descripción
deephits
Reemplaza el número de visitas predeterminado que se usa como base para el cálculo de refinamiento. Cuando se producen los refinadores, se evaluará todos los resultados de la consulta. Normalmente, con este parámetro mejorará el rendimiento de la búsqueda.
Sintaxis
deephits=<integer value>
Ejemplo
price(deephits=1000)
Nota: Este límite se aplica dentro de cada partición de índice. El número real de visitas que se evalúan será mayor que este valor debido a la agregación en particiones de búsqueda.
discretize
Especifica intervalos personalizados (contenedores de refinamiento) para refinadores numéricos.
Sintaxis
discretize=manual/<threshold>/<threshold>[/<threshold>]*
Ejemplo
write(discretize=manual/2013-01-01/2013-08-22/2013-09-15/2013-09-21/2013-09-22)
El atributo <threshold> especifica el umbral para cada contenedor de refinamiento.
Hay un intervalo para todos los elementos que están por debajo del primer umbral especificado, un intervalo entre cada umbral consecutivo y un intervalo para todos los elementos que están por encima del último umbral.
Para un refinador de tipo DateTime, especifique el umbral de acuerdo con uno de los siguientes formatos ISO 8601 compatibles:
  • YYYY-MM-DD
  • YYYY-MM-DDThh:mm:ss
  • YYYY-MM-DDThh:mm:ss:Z
Los valores de formato especifican lo siguiente:
  • YYYY - año de cuatro dígitos. Se admiten sólo cuatro dígitos.
  • MM - mes de dos dígitos. 01 = enero.
  • DD - día de dos dígitos del mes (01 a 31).
  • T - la letra "T".
  • hh : hora de dos dígitos (de 00 a 23). No se permite la indicación A.M. o P.M.
  • mm - dos dígitos minuto (00 a 59).
  • ss - de dos dígitos segundos (00 a 59).
Importante: Todos los valores de fecha y hora deben especificarse de acuerdo con la hora universal coordinada (UTC), también conocida como zona greenwich mean time (GMT). El identificador de zona de hora UTC (un carácter "Z" al final) es opcional.
sort
Define cómo se ordenan los contenedores dentro de un refinador de cadena.
Sintaxis
sort=<property>/<direction>
Los atributos realizan lo siguiente:
  • <property> - especifica el algoritmo de ordenación. Estos valores en minúsculas son válidos:
    • frequency - ordena por repetición en los contenedores.
    • name - ordena por nombre de etiqueta.
    • number - trata las cadenas como numérico y usa la ordenación numérica. Este valor puede ser útil para especificar valores discretos, por ejemplo, para realizar una ordenación numérica de un valor que se encuentra en una propiedad administrada de tipo String.
  • <direction> - especifica la dirección de ordenación. Estos valores en minúsculas son válidos:
    • descending
    • ascending
Ejemplo
sort=name/ascending
Predeterminado: Default frecuencia/descendente.
filter
Define cómo se filtran los contenedores de un refinador de tipo String antes de que se devuelvan al cliente.
Sintaxis
filter=<bins>/<freq>/<prefix>[<levels>]
Los atributos realizan lo siguiente:
  • <bins> - especifica el número máximo de contenedores devueltos.
    Después de ordenar las ubicaciones dentro de refinador, use este atributo para truncar cualquier bins al final. Por ejemplo, si las papeleras = 10, se devuelven sólo los 10 primeros bins, según el algoritmo de clasificación especificado.
  • <freq> - limita la cantidad de contenedores devueltos.
    Use este atributo para quitar los contenedores que tienen recuentos de baja frecuencia. Por ejemplo, freq= 2 indica que solo los contenedores con 2 o más miembros se devuelven.
  • <prefix> - especifica que se devuelvan sólo los contenedores con un nombre que comienza con este prefijo.
    El carácter comodín "*" coincidirá con todos los nombres.
    Ejemplo
    filter=30/2/*
  • <levels> - especifica los niveles de taxonomía.
    Use este atributo para filtrar el resultado del refinador jerárquico según los niveles de taxonomía. El atributo debe ser un entero positivo n. El valor de default es n= 0. Si n>0, solo se devolverán las entradas de refinador que contengan menos de n símbolos separadores de ruta de acceso de taxonomía ("/"). Si n= 0, no se realiza ningún filtrado en el nivel. El separador de nivel es el carácter de barra diagonal ("/").
    Tenga en cuenta el costo de rendimiento de utilizar un navegador de taxonomía de gran tamaño. El filtrado se realiza como parte del procesamiento de resultados.
Nota: Este parámetro aplica el filtrado del lado de resultados específico de la aplicación. Esto difiere del parámetro corte, que se aplica a las limitaciones de cada partición de índice por motivos de rendimiento.
cutoff
Limita los datos que deben transferirse y procesan para los refinadores de cadena profundo. Puede configurar los refinadores para devolver únicamente los valores más relevantes (ubicaciones).
Nota: Este filtrado de límite se realiza dentro de cada partición de índice. This differs from the filter parameter, which performs result-side filtering only. You can combine the two parameters.
Sintaxis
cutoff=<frequency>/<minbins>/<maxbins>
Los atributos realizan lo siguiente:
  • <maxbins> - limita la cantidad de contenedores.
    Este parámetro limita el número de valores únicos (ubicaciones) que se devuelve para un refinador. Es el método preferido para aumentar el rendimiento de la búsqueda cuando se devuelven los refinadores de cadena con gran número de ubicaciones. "0" indica que se usa el valor predeterminado especificado en el esquema de búsqueda.
  • <frequency> - limita la cantidad de contenedores según la frecuencia.
    Si el número de repeticiones de un valor de refinador en un conjunto de resultados es menor o igual que el valor de frecuencia, no se devuelve el valor del refinador. "0" indica que se usa el valor predeterminado de acuerdo con el esquema de búsqueda.
  • <minbins> - especifica el valor mínimo de límite de la frecuencia.
    Si el número de valores de refinador único para la consulta es menor que este valor, no se lleva a cabo ningún límite de la frecuencia y se devuelven todos los valores de refinador de esa partición de búsqueda. Cuando se usa el límite de frecuencia, este parámetro se puede utilizar para especificar un número mínimo de valores de refinador único que se devolverán independientemente del número de repeticiones. El valor predeterminado de este atributo es "0", que indica la frecuencia límite se lleva a cabo independientemente del número de valores únicos navigator. "0" indica que se usa el valor predeterminado especificado en el esquema de índice.
Nota: Use <frecuencia> y <minbins> con cuidado. Se recomienda usar solo <maxbins>.

Ejemplo: agregar refinadores

En el siguiente ejemplo CSOM muestra cómo solicitar mediante programación tres refinadores: FileType, Writey Companies. Write representa la fecha de última modificación del elemento y usa la sintaxis avanzada para devolver el tamaño fijo papeleras de fecha y hora.

using (var context = new ClientContext("http://<serverName>/<siteCollectionPath>"))
{
    var query = new KeywordQuery(context)
    {
        QueryText = "home",
        Refiners = "FileType,Write(discretize=manual/2013-01-01/2013-08-22/2013-09-
            15/2013-09-21/2013-09-22),companies"
    };

    var executor = new SearchExecutor(context);
    var results = executor.ExecuteQuery(query);

    context.ExecuteQuery();

    ResultTable relevantResultsTable = results.Value[0];
    ResultTable refinerResultsTable = results.Value[1];
    Console.WriteLine(refinerResultsTable.RowCount + " refinement options:");
    foreach (var refinementOption in refinerResultsTable.ResultRows)
    {
        Console.WriteLine("RefinerName: '{0}' RefinementName: '{1}'
            RefinementValue: '{2}' RefinementToken: '{3}' RefinementCount: '{4}'",
            refinementOption["RefinerName"],
            refinementOption["RefinementName"],
            refinementOption["RefinementValue"],
            refinementOption["RefinementToken"],
            refinementOption["RefinementCount"]
        );
    }
}

Entender los datos de refinamiento en los resultados de la búsqueda

Si ha habilitado el refinamiento de consultas para una propiedad administrada en la consulta, el resultado de la consulta contiene datos de refinamiento divididos en contenedores de refinamiento. Estos datos se encuentran en la tabla RefinementResults ( RefinementResults ) dentro de ResultTableCollection . Un contenedor de refinamiento representa un valor o intervalo de valores específico para la propiedad administrada. La tabla RefinementResults contiene una fila por cada contenedor de refinamiento y contiene las columnas, tal como se especifica en la tabla 2.

Tabla 2. Datos devueltos para cada contenedor de refinamiento

Parámetro Descripción
RefinerName El nombre del refinador de consulta.
RefinementName La cadena que representa el contenedor de refinamiento. Esta cadena se suele usar cuando se realiza la presentación de las opciones de refinamiento a los usuarios en una página de resultados de búsqueda.
RefinementValue Una cadena con formato específico de la implementación que representa el refinamiento. Estos datos se devuelven para la depuración y normalmente no es necesarios para el cliente.
RefinementToken Una cadena que representa el contenedor de refinamiento para usar con RefinerName cuando se realiza una consulta refinada.
RefinementCount El número de resultados para este contenedor de refinamiento. Estos datos representan el número de elementos (incluidos los duplicados) en el resultado de búsqueda con un valor para la propiedad administrada determinada que se encuentre en este contenedor de refinamiento.

Ejemplo: datos de refinamiento

La tabla 3 contiene dos filas de datos de refinamiento. La primera fila contiene los datos de refinamiento de los elementos indizados, donde el tipo de archivo es HTML. La segunda fila contiene datos de los elementos indizados, donde la última vez que modificó son de 2013/09/21 hasta 2013/09/22 de refinamiento.

Tabla 3: Formato y contenido de datos de refinamiento

RefinerName RefinementName RefinementValue RefinementToken RefinementCount
FileType HTML HTML "????68746d6c" 50553
Escritura De 2013-09-21T00:00:00Z hasta 2013-09-22T00:00:00Z De 2013-09-21T00:00:00Z hasta 2013-09-22T00:00:00Z intervalo (2013-09-21T00:00:00Z, 2013-09-22T00:00:00Z) 37

Creación de una consulta refinada

Un resultado de búsqueda presenta las opciones de refinamiento en forma de valores de cadena o intervalos de valores. Cada valor de tipo string o un intervalo de valores numéricos se llama a un contenedor de refinamientoy, a continuación, cada contenedor de refinamiento tiene un valor asociado RefinementToken. Una opción de refinamiento está asociada a una propiedad administrada, que es proporcionada por el valor de RefinerName.

Los RefinementTokenRefinerName valores y se concatenen para crear una cadena de refinement filter. Esta cadena representa un filtro que se pueden usar para limitar los elementos de resultado de búsqueda para incluir sólo los elementos que una propiedad administrada tiene un valor dentro de un contenedor de refinamiento. En short:

refinement filter = <RefinerName>:<RefinementToken>

Puede proporcionar uno o varios filtros de refinamiento para una consulta refinada agregando filtros de refinamiento a la propiedad RefinementFilters de la clase KeywordQuery . Varios filtros de refinamiento le permiten proporcionar varios niveles de detalle en los resultados de búsqueda y para aplicar el refinamiento en propiedades multivalor. Por ejemplo, puede restringir la consulta a los elementos que tienen dos autores: cada uno de ellos representado por un contenedor de refinamiento - pero los elementos de exclusión que tienen solo uno de los autores.

Ejemplo 1: crear una consulta refinada para tipos de archivo HTML

El siguiente ejemplo CSOM muestra cómo realizar mediante programación un refinamiento, para limitar los resultados de búsqueda a los de tipo de archivo HTML. Como se mencionó en Ejemplo: Datos de refinamiento, los datos de refinamiento relacionados con esta opción de refinamiento tienen RefinerName establecido en Filetype y RefinementToken establecido en "???? 68746d6c".

using (var context = new ClientContext("http://<serverName>/<siteCollectionPath>"))
{
    var query = new KeywordQuery(context)
    {
        QueryText = "home"
    };

    query.RefinementFilters.Add("FileType:\\"????68746d6c\\"");
    var executor = new SearchExecutor(context);
    var results = executor.ExecuteQuery(query);

    context.ExecuteQuery();

    ResultTable relevantResultsTable = results.Value[0];
    var resultCount = 1;
    foreach (var relevantResult in relevantResultsTable.ResultRows)
    {
        Console.WriteLine("Relevant result number {0} has file type {1}.",
            resultCount, relevantResult["FileType"]);
            resultCount++;
    }
}

Ejemplo 2: crear una consulta refinada con datos de refinamiento previamente obtenidos

En el siguiente ejemplo CSOM muestra cómo ejecutar una consulta con una especificación de refinador para crear datos de refinamiento que posteriormente se usan para llevar a cabo el refinamiento. En este ejemplo se simula el proceso de un usuario final selecciona la primera opción de refinamiento.

using (var context = new ClientContext("http://<serverName>/<siteCollectionPath>"))
{
    // Step 1: Run the query with refiner spec to provide refinement data in search result
    var query = new KeywordQuery(context)
    {
        QueryText = "home",
        Refiners = "FileType,Write(discretize=manual/2013-01-01/2013-08-22/2013-09-15/2013-09-21/2013-09-22),companies"
    };

    Console.WriteLine("Run query '{0}' with refiner spec '{1}'.", query.QueryText, query.Refiners);
    var executor = new SearchExecutor(context);
    var results = executor.ExecuteQuery(query);
    context.ExecuteQuery();

    // The query has been run and we can now look at the refinement data, to view the
    // refinement options
    ResultTable relevantResultsTable = results.Value[0];
    ResultTable refinerResultsTable = results.Value[1];
    Console.WriteLine("Got back {0} refinement options in the result:",
        refinerResultsTable.RowCount);

    foreach (var refinementOption in refinerResultsTable.ResultRows)
    {
        Console.WriteLine("RefinerName: '{0}' RefinementName: '{1}'
            RefinementValue: '{2}' RefinementToken: '{3}' RefinementCount: '{4}'",
            refinementOption["RefinerName"],
            refinementOption["RefinementName"],
            refinementOption["RefinementValue"],
            refinementOption["RefinementToken"],
            refinementOption["RefinementCount"]
        );
    }

    // Step 2: Run the refined query with refinement filter to drill down into
    // the search results. This example uses the first refinement option in the refinement
    // data, if available. This simulates an end user selecting this refinement option.
    var refinementOptionArray = refinerResultsTable.ResultRows.ToArray();

    if (refinementOptionArray.Length > 0)
    {
        var firstRefinementOption = refinementOptionArray[6];
        // Construct the refinement filter by concatenation
        var refinementFilter = firstRefinementOption["RefinerName"] + ":" +
            firstRefinementOption["RefinementToken"];
        var refinedQuery = new KeywordQuery(context)
        {
            QueryText = query.QueryText
        };
        refinedQuery.RefinementFilters.Add(refinementFilter);
        refinedQuery.SelectProperties.Add("FileType");
        refinedQuery.SelectProperties.Add("Write");
        refinedQuery.SelectProperties.Add("Companies");
        Console.WriteLine("Run query '{0}' with refinement filter '{1}'",
            refinedQuery.QueryText, refinementFilter);
        var refinedResults = executor.ExecuteQuery(refinedQuery);
        context.ExecuteQuery();
        ResultTable refinedRelevantResultsTable = refinedResults.Value[0];
        var resultCount = 1;
        foreach (var relevantResult in refinedRelevantResultsTable.ResultRows)
        {
            Console.WriteLine("Relevant result number {0} has FileType='{1}',
                Write='{2}', Companies='{3}'",
                resultCount,
                relevantResult["FileType"],
                relevantResult["Write"],
                relevantResult["Companies"]
            );
            resultCount++;
        }
    }
}

Consulte también

Otros recursos