Compartir vía


Ejemplos de sintaxis de búsqueda completa Lucene (consultas avanzadas)

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 recorrer ejemplos que muestran las operaciones de consulta basadas en 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=2024-07-01

El cuerpo de la solicitud debe formarse como JSON válido:

{
    "search": "*",
    "queryType": "full",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • search establecer en * es una consulta no especificada, equivalente a la búsqueda nula o vacía. 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 establecer en completa invoca al analizador de consultas de Lucene completo y es necesario para esta sintaxis.

  • select establecer en una lista delimitada por comas de campos se usa para la composición de resultados de búsqueda, incluidos solo los campos que son útiles en el contexto de los resultados de 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).

Las expresiones de búsqueda insertadas individuales y insertadas se limitan a 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=2024-07-01
{
    "search": "HotelName:(hotel NOT motel) AND Category:'Boutique'",
    "queryType": "full",
    "select": "HotelName, Category",
    "count": true
}

La respuesta de esta consulta debe ser similar al ejemplo siguiente, filtrada con Boutique, devuelve hoteles que incluyen hotel en el nombre, al tiempo que excluye los resultados que incluyen motel en el nombre.

{
  "@odata.count": 5,
  "value": [
    {
      "@search.score": 2.2289815,
      "HotelName": "Stay-Kay City Hotel",
      "Category": "Boutique"
    },
    {
      "@search.score": 1.3862944,
      "HotelName": "City Skyline Antiquity Hotel",
      "Category": "Boutique"
    },
    {
      "@search.score": 1.355046,
      "HotelName": "Old Century Hotel",
      "Category": "Boutique"
    },
    {
      "@search.score": 1.355046,
      "HotelName": "Sublime Palace Hotel",
      "Category": "Boutique"
    },
    {
      "@search.score": 1.355046,
      "HotelName": "Red Tide Hotel",
      "Category": "Boutique"
    }
  ]
}

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 una frase entre comillas si desea que ambas cadenas se evalúen como una sola entidad, como en este caso buscando dos ubicaciones 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. Para obtener información sobre cómo se atribuyen las definiciones de campo, consulte Crear índice (API REST).

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=2024-07-01
{
    "search": "Tags:conserge~",
    "queryType": "full",
    "select": "HotelName, Category, Tags",
    "searchFields": "HotelName, Category, Tags",
    "count": true
}

La respuesta de esta consulta devuelve conserje en los documentos coincidentes, recortados para abreviar:

{
  "@odata.count": 9,
  "value": [
    {
      "@search.score": 1.4947624,
      "HotelName": "Twin Vortex Hotel",
      "Category": "Luxury",
      "Tags": [
        "bar",
        "restaurant",
        "concierge"
      ]
    },
    {
      "@search.score": 1.1685618,
      "HotelName": "Stay-Kay City Hotel",
      "Category": "Boutique",
      "Tags": [
        "view",
        "air conditioning",
        "concierge"
      ]
    },
    {
      "@search.score": 1.1465473,
      "HotelName": "Old Century Hotel",
      "Category": "Boutique",
      "Tags": [
        "pool",
        "free wifi",
        "concierge"
      ]
    },
. . .
  ]
}

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 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 tilde al final de una frase seguido del número de palabras que crean el límite de proximidad.

Esta consulta busca los términos hotel y aeropuerto dentro de cinco palabras entre sí en un documento. Las comillas se convierten en caracteres de escape (\") para conservar la frase:

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

La respuesta de esta consulta debe ser similar al siguiente ejemplo:

{
  "@odata.count": 1,
  "value": [
    {
      "@search.score": 0.69167054,
      "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."
    }
  ]
}

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 acceso a la playa y verá que hay seis documentos con coincidencias de uno o ambos términos.

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

De hecho, solo dos documentos coinciden con acceso. La primera instancia está en segunda posición, aunque falta el término playa en el documento.

{
  "@odata.count": 6,
  "value": [
    {
      "@search.score": 1.068669,
      "HotelName": "Johnson's Family Resort",
      "Description": "Family oriented resort located in the heart of the northland. Operated since 1962 by the Smith family, we have grown into one of the largest family resorts in the state. The home of excellent Smallmouth Bass fishing with 10 small cabins, we're a home not only to fishermen but their families as well. Rebuilt in the early 2000's, all of our cabins have all the comforts of home. Sporting a huge **beach** with multiple water toys for those sunny summer days and a Lodge full of games for when you just can't swim anymore, there's always something for the family to do. A full marina offers watercraft rentals, boat launch, powered dock slips, canoes (free to use), & fish cleaning facility. Rent pontoons, 14' fishing boats, 16' fishing rigs or jet ski's for a fun day or week on the water. Pets are accepted in the lakeside cottages.",
      "Tags": [
        "24-hour front desk service",
        "pool",
        "coffee in lobby"
      ]
    },
    {
      "@search.score": 1.0162708,
      "HotelName": "Campus Commander Hotel",
      "Description": "Easy **access** to campus and steps away from the best shopping corridor in the city. From meetings in town or gameday, enjoy our prime location between the union and proximity to the university stadium.",
      "Tags": [
        "free parking",
        "coffee in lobby",
        "24-hour front desk service"
      ]
    },
    {
      "@search.score": 0.9050383,
      "HotelName": "Lakeside B & B",
      "Description": "Nature is Home on the **beach**. Explore the shore by day, and then come home to our shared living space to relax around a stone fireplace, sip something warm, and explore the library by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.",
      "Tags": [
        "laundry service",
        "concierge",
        "free parking"
      ]
    },
    {
      "@search.score": 0.8955848,
      "HotelName": "Windy Ocean Motel",
      "Description": "Oceanfront hotel overlooking the **beach** features rooms with a private balcony and 2 indoor and outdoor pools. Inspired by the natural beauty of the island, each room includes an original painting of local scenes by the owner. Rooms include a mini fridge, Keurig coffee maker, and flatscreen TV. Various shops and art entertainment are on the boardwalk, just steps away.",
      "Tags": [
        "pool",
        "air conditioning",
        "bar"
      ]
    },
    {
      "@search.score": 0.83636594,
      "HotelName": "Happy Lake Resort & Restaurant",
      "Description": "The largest year-round resort in the area offering more of everything for your vacation – at the best value! What can you enjoy while at the resort, aside from the mile-long sandy **beaches** of the lake? Check out our activities sure to excite both young and young-at-heart guests. We have it all, including being named “Property of the Year” and a “Top Ten Resort” by top publications.",
      "Tags": [
        "pool",
        "bar",
        "restaurant"
      ]
    },
    {
      "@search.score": 0.7808502,
      "HotelName": "Swirling Currents Hotel",
      "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking **access** to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. ",
      "Tags": [
        "air conditioning",
        "laundry service",
        "24-hour front desk service"
      ]
    }
  ]
}

En la consulta posterior, se repite la búsqueda, y esta vez se da prioridad a los resultados con el término playa sobre el término acceso. 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.

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

Después de aumentar el término playa, la coincidencia con Campus Commander Hotel se mueve hasta el quinto lugar.

{
  "@odata.count": 6,
  "value": [
    {
      "@search.score": 2.137338,
      "HotelName": "Johnson's Family Resort",
      "Description": "Family oriented resort located in the heart of the northland. Operated since 1962 by the Smith family, we have grown into one of the largest family resorts in the state. The home of excellent Smallmouth Bass fishing with 10 small cabins, we're a home not only to fishermen but their families as well. Rebuilt in the early 2000's, all of our cabins have all the comforts of home. Sporting a huge beach with multiple water toys for those sunny summer days and a Lodge full of games for when you just can't swim anymore, there's always something for the family to do. A full marina offers watercraft rentals, boat launch, powered dock slips, canoes (free to use), & fish cleaning facility. Rent pontoons, 14' fishing boats, 16' fishing rigs or jet ski's for a fun day or week on the water. Pets are accepted in the lakeside cottages.",
      "Tags": [
        "24-hour front desk service",
        "pool",
        "coffee in lobby"
      ]
    },
    {
      "@search.score": 1.8100766,
      "HotelName": "Lakeside B & B",
      "Description": "Nature is Home on the beach. Explore the shore by day, and then come home to our shared living space to relax around a stone fireplace, sip something warm, and explore the library by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.",
      "Tags": [
        "laundry service",
        "concierge",
        "free parking"
      ]
    },
    {
      "@search.score": 1.7911696,
      "HotelName": "Windy Ocean Motel",
      "Description": "Oceanfront hotel overlooking the beach features rooms with a private balcony and 2 indoor and outdoor pools. Inspired by the natural beauty of the island, each room includes an original painting of local scenes by the owner. Rooms include a mini fridge, Keurig coffee maker, and flatscreen TV. Various shops and art entertainment are on the boardwalk, just steps away.",
      "Tags": [
        "pool",
        "air conditioning",
        "bar"
      ]
    },
    {
      "@search.score": 1.6727319,
      "HotelName": "Happy Lake Resort & Restaurant",
      "Description": "The largest year-round resort in the area offering more of everything for your vacation – at the best value! What can you enjoy while at the resort, aside from the mile-long sandy beaches of the lake? Check out our activities sure to excite both young and young-at-heart guests. We have it all, including being named “Property of the Year” and a “Top Ten Resort” by top publications.",
      "Tags": [
        "pool",
        "bar",
        "restaurant"
      ]
    },
    {
      "@search.score": 1.0162708,
      "HotelName": "Campus Commander Hotel",
      "Description": "Easy access to campus and steps away from the best shopping corridor in the city. From meetings in town or gameday, enjoy our prime location between the union and proximity to the university stadium.",
      "Tags": [
        "free parking",
        "coffee in lobby",
        "24-hour front desk service"
      ]
    },
    {
      "@search.score": 0.7808502,
      "HotelName": "Swirling Currents Hotel",
      "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. ",
      "Tags": [
        "air conditioning",
        "laundry service",
        "24-hour front desk service"
      ]
    }
  ]
}

Ejemplo 5: Regex

Una búsqueda de expresiones regulares busca una coincidencia basada en el contenido entre barras diagonales / y cadenas en minúsculas, tal como se documenta en la clase RegExp.

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

La respuesta de esta consulta debe ser similar al ejemplo siguiente (recortado para mayor brevedad):

{
  "@odata.count": 25,
  "value": [
    {
      "@search.score": 1,
      "HotelName": "Country Residence Hotel"
    },
    {
      "@search.score": 1,
      "HotelName": "Downtown Mix Hotel"
    },
    {
      "@search.score": 1,
      "HotelName": "Gastronomic Landscape Hotel"
    },
    . . . 
    {
      "@search.score": 1,
      "HotelName": "Trails End Motel"
    },
    {
      "@search.score": 1,
      "HotelName": "Nordick's Valley Motel"
    },
    {
      "@search.score": 1,
      "HotelName": "King's Cellar 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 (?). 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=2024-07-01
{
    "search": "HotelName:sc*",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

La respuesta de esta consulta debe ser similar al siguiente ejemplo:

{
  "@odata.count": 1,
  "value": [
    {
      "@search.score": 1,
      "HotelName": "Waterfront 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.

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.

Puede encontrar más referencias de sintaxis, arquitectura de consulta y ejemplos en los siguientes artículos: