Filtros em Azure Cognitive Search

Um filtro fornece critérios baseados em valor para selecionar quais documentos incluir nos resultados de pesquisa. Um filtro pode ser um único valor ou uma expressão de filtro OData. Em contraste com a pesquisa completa de texto, um filtro só terá sucesso se for feita uma correspondência exata.

Os filtros são especificados em campos individuais. Uma definição de campo deve ser atribuída como "filtrada" se quiser usá-la em expressões de filtro.

Quando usar um filtro

Os filtros são fundamentais para várias experiências de pesquisa, incluindo a pesquisa geoespacial "find near me", a navegação facial e os filtros de segurança que mostram apenas esses documentos que um utilizador pode ver. Se implementar alguma destas experiências, é necessário um filtro. É o filtro anexado à consulta de pesquisa que fornece as coordenadas de geolocalização, a categoria faceta selecionada pelo utilizador ou o ID de segurança do solicitador.

Os cenários comuns incluem:

  • Corte os resultados da pesquisa com base no conteúdo do índice. Dado um esquema com localização, categorias e comodidades do hotel, você pode criar um filtro para combinar explicitamente com critérios (em Seattle, na água, com vista).

  • Implementar uma experiência de pesquisa vem com uma dependência de filtro:

    • A navegação com faceta utiliza um filtro para passar para trás a categoria faceta selecionada pelo utilizador.
    • A pesquisa geoespacial utiliza um filtro para passar coordenadas da localização atual em apps e funções "find near me" que correspondem dentro de uma área ou à distância.
    • Os filtros de segurança passam os identificadores de segurança como critérios de filtragem, onde uma correspondência no índice serve de procuração para direitos de acesso ao documento.
  • Faça uma "pesquisa de números". Os campos numéricos são recuperáveis e podem aparecer nos resultados da pesquisa, mas não são pesmáveis (sujeitos a pesquisa completa de texto) individualmente. Se precisar de critérios de seleção com base em dados numéricos, utilize um filtro.

Como os filtros são executados

No tempo de consulta, um analisador de filtro aceita critérios como entrada, converte a expressão em expressões atómicas booleanas representadas como uma árvore, e depois avalia a árvore filtrante sobre campos filtrados em um índice.

A filtragem ocorre em conjunto com a pesquisa, qualificando quais os documentos a incluir no processamento a jusante para recuperação de documentos e pontuação de relevância. Quando emparelhado com uma cadeia de pesquisa, o filtro reduz eficazmente o conjunto de recolha da operação de pesquisa subsequente. Quando utilizado sozinho (por exemplo, quando a cadeia de consulta está vazia onde search=*), os critérios do filtro são a única entrada.

Filtragem de definição

Os filtros são expressões OData, articuladas na sintaxe do filtro suportada pela Pesquisa Cognitiva.

Pode especificar um filtro para cada operação de pesquisa , mas o filtro em si pode incluir vários campos, vários critérios, e se utilizar uma função ismatch , várias expressões de pesquisa de texto completo. Numa expressão de filtro multi-partes, pode especificar predicados por qualquer ordem (sujeito às regras de precedência do operador). Não há ganhos apreciáveis no desempenho se tentar reorganizar predicados numa determinada sequência.

Um dos limites de uma expressão de filtro é o limite máximo de tamanho do pedido. Todo o pedido, incluindo o filtro, pode ser um máximo de 16 MB para POST, ou 8 KB para GET. Existe também um limite para o número de cláusulas na sua expressão de filtro. Uma boa regra é que se tiver centenas de cláusulas, corre o risco de chegar ao limite. Recomendamos que desenhe a sua aplicação de modo a não gerar filtros de tamanho ilimitado.

Os exemplos a seguir representam definições de filtros prototípicos em várias APIs.

POST https://[service name].search.windows.net/indexes/hotels/docs/search?api-version=2020-06-30
{
    "search": "*",
    "filter": "Rooms/any(room: room/BaseRate lt 150.0)",
    "select": "HotelId, HotelName, Rooms/Description, Rooms/BaseRate"
}
    parameters =
        new SearchParameters()
        {
            Filter = "Rooms/any(room: room/BaseRate lt 150.0)",
            Select = new[] { "HotelId", "HotelName", "Rooms/Description" ,"Rooms/BaseRate"}
        };

    var results = searchIndexClient.Documents.Search("*", parameters);

Padrões de filtro

Os exemplos a seguir ilustram vários padrões de utilização para cenários de filtro. Para mais ideias, consulte a sintaxe de > expressão OData Exemplos.

  • Autónomo $filter, sem uma cadeia de consulta, útil quando a expressão do filtro é capaz de qualificar totalmente documentos de interesse. Sem uma cadeia de consultas, não há análise lexical ou linguística, nem pontuação, nem classificação. Note que a cadeia de pesquisa é apenas um asterisco, o que significa "combinar todos os documentos".

    {
      "search": "*",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Honolulu"
    }
    
  • Combinação de cadeia de consulta e $filter, onde o filtro cria o subconjunto, e a cadeia de consulta fornece o termo entradas para pesquisa completa de texto sobre o subconjunto filtrado. A adição de termos (teatros de distância a pé) introduz pontuações de pesquisa nos resultados, onde os documentos que melhor correspondem aos termos são classificados mais alto. A utilização de um filtro com uma corda de consulta é o padrão de utilização mais comum.

    {
      "search": "walking distance theaters",
      "filter": "Rooms/any(room: room/BaseRate ge 60 and room/BaseRate lt 300) and Address/City eq 'Seattle'"
    }
    
    
  • Consultas compostas, separadas por "ou", cada uma com os seus próprios critérios de filtro (por exemplo, 'beagles' em 'cão' ou 'siamese' em 'gato'). As expressões combinadas são or avaliadas individualmente, com a união de documentos correspondente a cada expressão enviada de volta na resposta. Este padrão de utilização é alcançado através da search.ismatchscoring função. Também pode utilizar a versão sem pontuação, search.ismatch.

    # Match on hostels rated higher than 4 OR 5-star motels.
    $filter=search.ismatchscoring('hostel') and Rating ge 4 or search.ismatchscoring('motel') and Rating eq 5
    
    # Match on 'luxury' or 'high-end' in the description field OR on category exactly equal to 'Luxury'.
    $filter=search.ismatchscoring('luxury | high-end', 'Description') or Category eq 'Luxury'&$count=true
    

    Também é possível combinar pesquisa de texto completo através search.ismatchscoring de filtros que usam and em vez de or, mas isso é funcionalmente equivalente a usar o e $filter os search parâmetros num pedido de pesquisa. Por exemplo, as duas seguintes consultas produzem o mesmo resultado:

    $filter=search.ismatchscoring('pool') and Rating ge 4
    
    search=pool&$filter=Rating ge 4
    

Requisitos de campo para filtragem

Na API REST, filtrado por defeito para campos simples. Os campos filtrados aumentam o tamanho do índice; certifique-se de definir "filterable": false para campos que não pretende realmente usar em um filtro. Para obter mais informações sobre as definições de campo, consulte 'Criar Índice'.

No .NET SDK, o filtrado está desligado por defeito. Pode tornar um campo filtrado definindo a propriedade IsFilterable do objeto SearchField correspondente a true. No exemplo abaixo, o atributo é definido na BaseRate propriedade de uma classe modelo que mapeia para a definição de índice.

[IsFilterable, IsSortable, IsFacetable]
public double? BaseRate { get; set; }

Tornar um campo existente filtrado

Não se pode modificar os campos existentes para os tornar filtrados. Em vez disso, tens de adicionar um novo campo, ou reconstruir o índice. Para obter mais informações sobre a reconstrução de um índice ou campos de repovoamento, consulte Como reconstruir um índice Azure Cognitive Search.

Fundamentos do filtro de texto

Os filtros de texto combinam os campos de cordas com as cordas literais que fornece no filtro: $filter=Category eq 'Resort and Spa'

Ao contrário da pesquisa por texto completo, não existe uma análise lexical ou quebra de palavras para filtros de texto, por isso as comparações são apenas para fósforos exatos. Por exemplo, assuma que um campo f contém "dia ensolarado", $filter=f eq 'sunny' não corresponde, mas $filter=f eq 'sunny day' vai.

As cadeias de texto são sensíveis ao caso, o que significa que os filtros de texto são sensíveis por defeito. Por exemplo, $filter=f eq 'Sunny day' não vai encontrar "dia ensolarado". No entanto, pode usar um normalizador para o tornar a filtragem não é sensível a casos.

Abordagens para filtragem em texto

Abordagem Description Quando utilizar
search.in Uma função que corresponde a um campo com uma lista delimitada de cordas. Recomendado para filtros de segurança e para quaisquer filtros onde muitos valores de texto brutos precisam de ser combinados com um campo de cordas. A função search.in é concebida para a velocidade e é muito mais rápida do que comparar explicitamente o campo com cada corda utilizando eq e or.
search.ismatch Uma função que permite misturar operações de pesquisa de texto completo com operações estritamente de filtro Boolean na mesma expressão de filtro. Utilize search.ismatch (ou o seu equivalente de pontuação, search.ismatchscoring) quando pretender várias combinações de filtros de pesquisa num único pedido. Também pode usá-lo para um filtro contém para filtrar uma corda parcial dentro de uma corda maior.
$filter=field operator string Uma expressão definida pelo utilizador composta por campos, operadores e valores. Use isto quando quiser encontrar correspondências exatas entre um campo de cordas e um valor de corda.

Fundamentos do filtro numérico

Os campos numéricos não searchable estão no contexto da pesquisa completa por texto. Apenas as cordas estão sujeitas a uma pesquisa completa por texto. Por exemplo, se introduzir 99.99 como termo de pesquisa, não receberá itens de volta com o preço de $99.99. Em vez disso, veria itens que têm o número 99 nos campos de cordas do documento. Assim, se tiver dados numéricos, o pressuposto é que os utilizará para filtros, incluindo gamas, facetas, grupos, etc.

Os documentos que contêm campos numéricos (preço, tamanho, SKU, ID) fornecem esses valores nos resultados de pesquisa se o campo estiver marcado retrievable. A questão aqui é que a pesquisa completa por texto em si não é aplicável aos tipos de campo numérico.

Passos seguintes

Primeiro, tente pesquisar o explorador no portal para submeter consultas com $filter parâmetros. O índice de amostra imobiliária fornece resultados interessantes para as seguintes consultas filtradas quando as colam na barra de pesquisa:

# Geo-filter returning documents within 5 kilometers of Redmond, Washington state
# Use $count=true to get a number of hits returned by the query
# Use $select to trim results, showing values for named fields only
# Use search=* for an empty query string. The filter is the sole input

search=*&$count=true&$select=description,city,postCode&$filter=geo.distance(location,geography'POINT(-122.121513 47.673988)') le 5

# Numeric filters use comparison like greater than (gt), less than (lt), not equal (ne)
# Include "and" to filter on multiple fields (baths and bed)
# Full text search is on John Leclerc, matching on John or Leclerc

search=John Leclerc&$count=true&$select=source,city,postCode,baths,beds&$filter=baths gt 3 and beds gt 4

# Text filters can also use comparison operators
# Wrap text in single or double quotes and use the correct case
# Full text search is on John Leclerc, matching on John or Leclerc

search=John Leclerc&$count=true&$select=source,city,postCode,baths,beds&$filter=city gt 'Seattle'

Para trabalhar com mais exemplos, consulte exemplos de sintaxe > de expressão de filtro de OData.

Ver também