Share via


Fonctions de recherche en texte intégral OData dans Azure AI Recherche - search.ismatch et search.ismatchscoring

Azure AI Recherche prend en charge la recherche en texte intégral dans le contexte d’expressions de filtre OData via les fonctions search.ismatch et search.ismatchscoring. Ces fonctions permettent de combiner la recherche en texte intégral avec le filtrage booléen strict qui est impossible avec l’utilisation du paramètre search de niveau supérieur de l’API de recherche.

Remarque

Les fonctions search.ismatch et search.ismatchscoring sont uniquement prises en charge dans les filtres de l’API de recherche. Elles ne sont pas prises en charge dans les API Suggest ou Autocomplete.

Syntaxe

L’extension EBNF suivante (Extended Backus-Naur Form) définit la grammaire des fonctions search.ismatch et search.ismatchscoring :

search_is_match_call ::=
    'search.ismatch'('scoring')?'(' search_is_match_parameters ')'

search_is_match_parameters ::=
    string_literal(',' string_literal(',' query_type ',' search_mode)?)?

query_type ::= "'full'" | "'simple'"

search_mode ::= "'any'" | "'all'"

Un diagramme de syntaxe interactif est également disponible :

search.ismatch

La fonction search.ismatch évalue la requête de recherche en texte intégral comme une partie d’une expression de filtre. Les documents qui correspondent à la requête de recherche sont retournés dans le jeu de résultats. Les surcharges suivantes de cette fonction sont disponibles :

  • search.ismatch(search)
  • search.ismatch(search, searchFields)
  • search.ismatch(search, searchFields, queryType, searchMode)

Les paramètres sont définis dans le tableau suivant :

Nom du paramètre Type Description
search Edm.String La requête de recherche (dans la syntaxe de requête Lucene simple ou complète).
searchFields Edm.String Liste séparée par des virgules de champs de recherche où effectuer des recherches ; par défaut, tous les champs avec possibilité de recherche dans l’index. Lorsque vous utilisez la recherche par champ dans le paramètre search, les spécificateurs de champ de la requête Lucene remplacent tous les champs spécifiés dans ce paramètre.
queryType Edm.String 'simple' ou 'full' ; par défaut 'simple'. Spécifie le langage de requête utilisé dans le paramètre search.
searchMode Edm.String 'any' ou 'all' ; par défaut 'any'. Indique si tout ou partie des termes de recherche du paramètre searchdoit correspondre pour que le document soit considéré comme une correspondance. Lorsque vous utilisez les opérateurs booléens Lucene dans le paramètre search, ils ont priorité sur ce paramètre.

Tous les paramètres ci-dessus sont équivalents aux paramètres de la requête de recherche de l’API de recherche correspondante.

La fonction search.ismatch renvoie une valeur de type Edm.Boolean, qui vous permet de la composer avec d’autres sous-expressions de filtre à l’aide des opérateurs logiques booléens.

Remarque

Azure AI Recherche ne prend pas en charge l’utilisation de search.ismatch ni search.ismatchscoring à l’intérieur des expressions lambda. Cela signifie qu’il n’est pas possible d’écrire des filtres sur les collections d’objets qui peuvent mettre en corrélation les correspondances de recherche en texte intégral avec des correspondances de filtre strict sur le même objet. Pour plus d’informations sur cette restriction et pour obtenir des exemples, consultez Résolution des problèmes de filtres de collection dans Azure AI Recherche. Pour en savoir plus sur la raison de l’existence de cette restriction, consultez Présentation des filtres de collection dans Azure AI Recherche.

Search.ismatchscoring

La fonction search.ismatchscoring, comme la fonction search.ismatch, renvoie true pour les documents qui correspondent à la requête de recherche en texte intégral transmise comme paramètre. La différence est que le score de pertinence des documents correspondant à la requête search.ismatchscoring contribue au score global du document, tandis que dans le cas de search.ismatch, le score du document n’est pas modifié. Les surcharges suivantes de cette fonction sont disponibles avec des paramètres identiques à ceux de search.ismatch :

  • search.ismatchscoring(search)
  • search.ismatchscoring(search, searchFields)
  • search.ismatchscoring(search, searchFields, queryType, searchMode)

Cela signifie que les deux fonctions search.ismatch et search.ismatchscoring peuvent être utilisées dans la même expression de filtre.

Exemples

Rechercher les documents avec le mot « waterfront ». Cette requête de filtre est identique à une demande de recherche avec search=waterfront.

    search.ismatchscoring('waterfront')

Rechercher les documents avec le mot « hostel » et une évaluation supérieure ou égale à 4, ou les documents avec le mot « motel » et une évaluation égale à 5. Notez que cette demande ne peut pas être exprimée sans la fonction search.ismatchscoring.

    search.ismatchscoring('hostel') and Rating ge 4 or search.ismatchscoring('motel') and Rating eq 5

Rechercher les documents sans le mot « luxury ».

    not search.ismatch('luxury')

Rechercher les documents avec la phrase « ocean view » ou une évaluation égale à 5. La requête search.ismatchscoring sera exécutée seulement sur les champs HotelName et Rooms/Description.

Les documents qui correspondent uniquement à la deuxième clause de la disjonction sont également renvoyés (hôtels avec une Rating égale à 5). L’explication est que ces documents ne correspondent à aucune des parties avec score de l’expression : ils sont renvoyés avec un score égal à zéro.

    search.ismatchscoring('"ocean view"', 'Rooms/Description,HotelName') or Rating eq 5

Rechercher les documents où les termes « hotel » et « airport » sont distants de 5 mots ou moins dans la description de l’hôtel, et où fumer n’est pas autorisé dans au moins certaines pièces. Cette requête utilise le langage de requête Lucene complet.

    search.ismatch('"hotel airport"~5', 'Description', 'full', 'any') and Rooms/any(room: not room/SmokingAllowed)

Recherchez des documents qui ont un mot commençant par les lettres « Lux » dans le champ Description. Cette requête utilise la recherche de préfixe en association avec search.ismatch.

    search.ismatch('lux*', 'Description')

Étapes suivantes