Ejemplos de sintaxis de búsqueda "completa" de Lucene (consultas avanzadas en Búsqueda de Azure AI)

Al construir consultas para Azure AI Search, se puede reemplazar el analizador de consultas sencillo predeterminado por el analizador de consultas de Lucene más eficaz para formular expresiones de consulta especializadas y avanzadas.

El analizador de Lucene admite formatos de consulta más complejos, como las consultas de ámbito de campo, la búsqueda aproximada y con caracteres comodín de infijos y sufijos, la búsqueda por proximidad, la priorización de términos y las expresiones regulares. La potencia adicional trae consigo más requisitos de procesamiento, por lo que se debe esperar un tiempo de ejecución un poco más largo. En este artículo, puede pasar por los ejemplos de operaciones de consulta según la sintaxis completa.

Nota:

Muchas de las construcciones de consulta especializadas habilitadas mediante la sintaxis de consulta completa de Lucene no son de análisis de texto, lo que puede ser sorprendente si espera lematización. Solo se realizan análisis léxicos en términos completos (consulta de término o de expresión). Los tipos de consulta con términos incompletos (consulta de prefijo, de carácter comodín, de expresión regular o aproximada) se agregan directamente en el árbol de la consulta, omitiéndose la fase de análisis. La única transformación que se realiza en los términos de consulta parciales es el establecimiento de minúsculas.

Índice hotels-sample

Las siguientes consultas se basan en el índice de búsqueda hoteles-sample-index, que puede crear siguiendo las instrucciones de este inicio rápido.

Las consultas de ejemplo se articulan mediante la API REST y las solicitudes POST. Puede pegarlas y ejecutarlas en un cliente REST. O bien, puede usar la vista JSON del Explorador de búsqueda en Azure Portal. En la vista JSON, puede pegar los ejemplos de consulta que se muestran aquí en este artículo.

Los encabezados de solicitud deben tener los siguientes valores:

Llave Value
Tipo de contenido application/json
api-key <your-search-service-api-key>, ya sea una consulta o una clave de administración

Los parámetros de URI deben incluir el punto de conexión del servicio de búsqueda con el nombre del índice, las colecciones de documentos, el comando de búsqueda y la versión de la API de manera similar al ejemplo siguiente:

https://{{service-name}}.search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2023-11-01

El cuerpo de la solicitud debe tener un formato JSON válido:

{
    "search": "*",
    "queryType": "full",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • "search" establecido en * es una consulta sin especificar que equivale a una búsqueda vacía o NULL. No es especialmente útil, pero es la búsqueda más sencilla que se puede hacer y muestra todos los campos recuperables en el índice, con todos sus valores.

  • "queryType" establecido en "full" invoca el analizador de consultas completas de Lucene y es necesario para esta sintaxis.

  • "select" establecido en una lista de campos delimitada por comas se usa para la composición del resultado de la búsqueda incluyendo solo los campos que son útiles en el contexto de los resultados de la búsqueda.

  • "count" devuelve el número de documentos que coinciden con los criterios de búsqueda. En una cadena de búsqueda vacía, el número representa todos los documentos que haya en el índice (50 en hotels-sample-index).

La búsqueda clasificada por campos establece el ámbito de las expresiones de búsqueda insertadas individuales en un campo específico. En este ejemplo se buscan nombres de hotel con el término "hotel" en ellos, pero no "motel". Puede especificar varios campos mediante AND.

A la hora de usar esta sintaxis de consulta, puede omitir el parámetro searchFields si los campos que quiere consultar se encuentren en la propia expresión de búsqueda. Si incluye searchFields con la búsqueda por campos, fieldName:searchExpression siempre tiene prioridad sobre searchFields.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:(hotel NOT motel) AND Category:'Resort and Spa'",
    "queryType": "full",
    "select": "HotelName, Category",
    "count": true
}

La respuesta a esta consulta debería ser similar a la del ejemplo siguiente, filtrada por "Complejo turístico y spa" y devolver nombres de hoteles que incluyen "hotel" y excluir aquellas que tienen "motel".

"@odata.count": 4,
"value": [
    {
        "@search.score": 4.481559,
        "HotelName": "Nova Hotel & Spa",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.4524608,
        "HotelName": "King's Palace Hotel",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.3970203,
        "HotelName": "Triple Landscape Hotel",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.2953436,
        "HotelName": "Peaceful Market Hotel & Spa",
        "Category": "Resort and Spa"
    }
]

La expresión de búsqueda puede ser un solo término, una frase o una expresión más compleja entre paréntesis, opcionalmente con operadores booleanos. A continuación se muestran algunos ejemplos:

  • HotelName:(hotel NOT motel)
  • Address/StateProvince:("WA" OR "CA")
  • Tags:("free wifi" NOT "free parking") AND "coffee in lobby"

Asegúrese de colocar la frase entre comillas si quiere que las dos cadenas se evalúen como una sola entidad, como en este caso para buscar dos ciudades distintas en el campo Address/StateProvince. Dependiendo del cliente, puede que tenga que convertir las comillas en caracteres de escape (\).

El campo especificado en fieldName:searchExpression debe ser un campo de búsqueda. Consulte el artículo Creación de un índice (API REST) para obtener más información sobre cómo usar atributos en las definiciones de campo.

La búsqueda aproximada busca coincidencias con términos similares, incluidas palabras mal escritas. Para realizar una búsqueda aproximada, agregue la virgulilla, ~, al final de una sola palabra con un parámetro opcional y un valor entre 0 y 2 para especificar la distancia de edición. Por ejemplo, blue~ o blue~1 devolverían blue, blues y glue.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "Tags:conserge~",
    "queryType": "full",
    "select": "HotelName, Category, Tags",
    "searchFields": "HotelName, Category, Tags",
    "count": true
}

La respuesta de esta consulta (acortada para simplificar) devuelve "concierge" (conserje) en los documentos coincidentes:

"@odata.count": 12,
"value": [
    {
        "@search.score": 1.1832147,
        "HotelName": "Secret Point Motel",
        "Category": "Boutique",
        "Tags": [
            "pool",
            "air conditioning",
            "concierge"
        ]
    },
    {
        "@search.score": 1.1819803,
        "HotelName": "Twin Dome Motel",
        "Category": "Boutique",
        "Tags": [
            "pool",
            "free wifi",
            "concierge"
        ]
    },
    {
        "@search.score": 1.1773309,
        "HotelName": "Smile Hotel",
        "Category": "Suite",
        "Tags": [
            "view",
            "concierge",
            "laundry service"
        ]
    },

Las frases no se admiten directamente, pero puede especificar una coincidencia aproximada en cada término de una frase de varias partes, como search=Tags:landy~ AND sevic~. Esta expresión de consulta encuentra 15 coincidencias para "laundry service" (servicio de lavandería).

Nota:

Las consultas aproximadas no se analizan. Los tipos de consulta con términos incompletos (consulta de prefijo, de carácter comodín, de expresión regular o aproximada) se agregan directamente en el árbol de la consulta, omitiéndose la fase de análisis. La única transformación que se realiza en los términos de consulta parciales es la conversión a minúsculas.

La búsqueda por proximidad busca términos que están cerca uno del otro en un documento. Inserte un símbolo "~" de la tilde de la Ñ al final de una frase seguido del número de palabras que crea el límite de proximidad.

Esta consulta busca los términos "hotel" y "airport" a menos de 5 palabras de distancia unos de otros en un documento. Las comillas se convierten en caracteres de escape (\") para conservar la frase:

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "Description: \"hotel airport\"~5",
    "queryType": "full",
    "select": "HotelName, Description",
    "searchFields": "HotelName, Description",
    "count": true
}

La respuesta de esta consulta debe tener un aspecto similar al del siguiente ejemplo:

"@odata.count": 2,
"value": [
    {
        "@search.score": 0.6331726,
        "HotelName": "Trails End Motel",
        "Description": "Only 8 miles from Downtown.  On-site bar/restaurant, Free hot breakfast buffet, Free wireless internet, All non-smoking hotel. Only 15 miles from airport."
    },
    {
        "@search.score": 0.43032226,
        "HotelName": "Catfish Creek Fishing Cabins",
        "Description": "Brand new mattresses and pillows.  Free airport shuttle. Great hotel for your business needs. Comp WIFI, atrium lounge & restaurant, 1 mile from light rail."
    }
]

Ejemplo 4: Priorización de términos

La "priorización de términos" hace referencia a la clasificación de un documento superior si contiene el término prioritario con respecto a los documentos que no lo contienen. Para aumentar un término, use el símbolo de intercalación, ^, con un factor de incremento (un número) al final del término que está buscando. De forma predeterminada, el factor de prioridad es 1 y, aunque debe ser positivo, puede ser menor que 1 (por ejemplo, 0,2). La priorización de términos difiere de los perfiles de puntuación en que estos últimos priorizan ciertos campos, en lugar de términos específicos.

En esta consulta "anterior", busque "beach access" (acceso a la playa). Verá que hay siete documentos con coincidencias de uno o ambos términos.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "beach access",
    "queryType": "full",
    "select": "HotelName, Description, Tags",
    "searchFields": "HotelName, Description, Tags",
    "count": true
}

De hecho, solo hay un documento en el que aparece "acceso" y, dado que es la única coincidencia, la posición es alta (segunda posición) aunque el documento no contenga el término "playa".

"@odata.count": 7,
"value": [
    {
        "@search.score": 2.2723424,
        "HotelName": "Nova Hotel & Spa",
        "Description": "1 Mile from the airport.  Free WiFi, Outdoor Pool, Complimentary Airport Shuttle, 6 miles from the beach & 10 miles from downtown."
    },
    {
        "@search.score": 1.5507699,
        "HotelName": "Old Carrabelle Hotel",
        "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center."
    },
    {
        "@search.score": 1.5358944,
        "HotelName": "Whitefish Lodge & Suites",
        "Description": "Located on in the heart of the forest. Enjoy Warm Weather, Beach Club Services, Natural Hot Springs, Airport Shuttle."
    },
    {
        "@search.score": 1.3433652,
        "HotelName": "Ocean Air Motel",
        "Description": "Oceanfront hotel overlooking the beach features rooms with a private balcony and 2 indoor and outdoor pools. Various shops and art entertainment are on the boardwalk, just steps away."
    },

En la consulta "posterior", se repite la búsqueda, y esta vez se da prioridad a los resultados con el término "beach" sobre el término "access". Una versión en lenguaje natural de la consulta es search=Description:beach^2 access. Dependiendo de su cliente, es posible que tenga que expresar ^2 como %5E2.

Después de dar prioridad al término "beach", la coincidencia de "Old Carrabelle Hotel" se desplaza a la sexta posición.

Ejemplo 5: Regex

Una búsqueda de expresión regular encuentra una coincidencia en función del contenido entre barras diagonales "/", como se documentó en la clase RegExp.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:/(Mo|Ho)tel/",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

La respuesta de esta consulta debe tener un aspecto similar al del siguiente ejemplo:

    "@odata.count": 22,
    "value": [
        {
            "@search.score": 1.0,
            "HotelName": "Days Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Triple Landscape Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Smile Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Pelham Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Sublime Cliff Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Twin Dome Motel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Nova Hotel & Spa"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Scarlet Harbor Hotel"
        },

Nota:

Las consultas Regex no se analizan. La única transformación que se realiza en los términos de consulta parciales es la conversión a minúsculas.

Puede usar la sintaxis generalmente reconocida para búsquedas con caracteres comodín únicas (*) o múltiples (?). Tenga en cuenta que el Analizador de consultas de Lucene admite el uso de estos símbolos con un único término y no una frase.

En esta consulta, busque los nombres de hotel que empiezan por "sc". No se puede usar los símbolos * ni ? como primer carácter de una búsqueda.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:sc*",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

La respuesta de esta consulta debe tener un aspecto similar al del siguiente ejemplo:

    "@odata.count": 2,
    "value": [
        {
            "@search.score": 1.0,
            "HotelName": "Scarlet Harbor Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Scottish Inn"
        }
    ]

Nota:

Las consultas con caracteres comodín no se analizan. La única transformación que se realiza en los términos de consulta parciales es la conversión a minúsculas.

Pasos siguientes

Pruebe a especificar las consultas en el código. El siguiente vínculo conduce a un artículo en el que se explica cómo configurar las consultas de búsqueda para los SDK de Azure.

En los vínculos siguientes, se pueden encontrar una referencia de la sintaxis, la arquitectura de las consultas y ejemplos: