Como classificar os resultados da consulta de pesquisa

Amy Unruh, outubro de 2012
Relações com desenvolvedores do Google

Introdução

Nesta lição, você verá como classificar os resultados de uma pesquisa por consulta, na ordem pretendida:

  • É possível classificar por valor de campo ou por expressões que o incluam.
  • É possível classificar pela pontuação, com base na classificação de frequência do documento, ou usar essa pontuação em uma expressão de classificação mais complexa.
  • As classificações podem ser multidimensionais, classificando-se prioritariamente em uma expressão de campo e depois em outra de forma secundária e assim por diante.

Com o aplicativo de exemplo, um usuário pode fazer a classificação pela medida de relevância ou execute classificações bidimensionais nos campos do documento.

Objetivos

Saiba como classificar os resultados de uma consulta de pesquisa da API Search

Pré-requisitos

Ter participado da aula anterior a esta, Introdução à API Python Search

É preciso ter também o seguinte:

A classe SortOptions

A base para a definição de ordens de classificação de resultados de consultas é fornecida pela classe SortOptions. Uma vez definido, um SortOptions object é usado como o parâmetro sort_options de um objeto QueryOptions:

from google.appengine.api import search

search.QueryOptions(
    sort_options=search.SortOptions(...)
    ...)

Classificar expressões

É possível transmitir ao construtor SortOptions um argumento expressions, que é um iterável de objetos SortExpression. Com isso, é possível executar uma classificação multidimensional, com base nos valores do campo do documento.

Na classe docs.Product do aplicativo de exemplo, você verá uma lista como esta:

_SORT_OPTIONS = [
    [AVG_RATING, 'average rating', search.SortExpression(
        expression=AVG_RATING,
        direction=search.SortExpression.DESCENDING, default_value=0)],
    [PRICE, 'price', search.SortExpression(
        expression=PRICE,
        direction=search.SortExpression.ASCENDING, default_value=9999)],
    [UPDATED, 'modified', search.SortExpression(
        expression=UPDATED,
        direction=search.SortExpression.DESCENDING, default_value=1)],
    [CATEGORY, 'category', search.SortExpression(
        expression=CATEGORY,
        direction=search.SortExpression.ASCENDING, default_value='')],
    [PRODUCT_NAME, 'product name', search.SortExpression(
        expression=PRODUCT_NAME,
        direction=search.SortExpression.ASCENDING, default_value='zzz')]
  ]

Nisso está definido um objeto SortExpression para um subconjunto de campos do documento do produto. Em cada definição, o parâmetro expression é simplesmente o nome do campo. Mais tarde, você verá algumas outras variantes de expressão. Observe que as expressões de classificação definem uma direção de classificação ASCENDING ou DESCENDING e um valor padrão, usado se um documento não incluir o campo especificado na expressão.

Em handlers.py, o método ProductSearchHandler.doProductSearch() usa essas definições para estabelecer uma classificação bidimensional, definindo uma lista ordenada de objetos SortExpression e passando essa lista como o parâmetro de expressions do construtor SortOptions. Se o usuário solicitar uma classificação por classificação média, faça uma classificação secundária por preço:

sortopts = search.SortOptions(expressions=[
    search.SortExpression(expression=docs.Product.AVG_RATING, direction='DESCENDING', default_value=0),
    search.SortExpression(expression=docs.Product.PRICE, direction='ASCENDING', default_value=9999)])

Caso contrário, digamos, se o usuário solicitar uma classificação por preço, a classificação secundária será feita por classificação média:

sortopts = search.SortOptions(expressions=[
    search.SortExpression(expression=docs.Product.PRICE, direction='ASCENDING', default_value=9999),
    search.SortExpression(expression=docs.Product.AVG_RATING, direction='DESCENDING', default_value=0)])

Então, como antes, você passa este objeto para o construtor QueryOptions:

search.QueryOptions(
    sort_options=sortopts
    ...)

Como usar funções de expressão em uma expressão de classificação

A propriedade expression em um objeto SortExpression pode ser mais do que apenas um nome de campo: é possível usar as funções de expressão, por exemplo, max, mencionadas na aula anterior. A expressão de classificação a seguir classifica pelo valor do campo price, ajustado para incluir o tributo sobre vendas:

search.SortExpression(
    expression='price * 1.08',
    direction=search.SortExpression.ASCENDING, default_value=9999)]

Como classificar campos GeoPoint por distância

Localizar todas as lojas dentro de um determinado raio de distância é algo bom, mas seria ainda melhor classificá-las pela distância em que se encontram. Isso pode ser feito adicionando uma expressão de classificação usando a função interna distance. A consulta a seguir localiza todas as lojas num raio de 4,5 quilômetros do usuário e classifica-as por distância, da mais próxima à mais distante:

index = search.Index(config.STORE_INDEX_NAME)
user_location = (-33.857, 151.215)
query = "distance(store_location, geopoint(%f, %f)) < %f" % (
    user_location[0], user_location[1], 45000)
loc_expr = "distance(store_location, geopoint(%f, %f))" % (
    user_location[0], user_location[1])
sortexpr = search.SortExpression(
    expression=loc_expr,
    direction=search.SortExpression.ASCENDING, default_value=45001)
search_query = search.Query(
    query_string=query,
    options=search.QueryOptions(
        sort_options=search.SortOptions(expressions=[sortexpr])))
results = index.search(search_query)

Pontuação correspondente

A classe MatchScorer é usada para classificar documentos em ordem crescente, usando uma pontuação baseada na frequência do termo. Um objeto MatchScorer é passado como o parâmetro match_scorer do construtor SortOptions:

sortopts = search.SortOptions(match_scorer=search.MatchScorer())
search.QueryOptions(
    sort_options=sortopts
    ...)

O aplicativo de exemplo usa essa classificação quando o usuário seleciona relevância no menu de classificação da consulta na IU.

Também é possível acessar a pontuação de um documento em uma expressão de classificação, usando o nome de campo especial _score. Nesse caso, seu objeto SortOptions precisa incluir um apontador, por exemplo,

search.SortOptions(match_scorer=search.MatchScorer(),
    expressions=[search.SortExpression(...),...])

Resumo e revisão

Nesta lição, você aprendeu a definir classificações multidimensionais em nossos resultados de pesquisa, especificando objetos SortExpression e MatchScorer e usando-os para criar o objeto SortOptions passado ao construtor QueryOptions.

Tente experimentar um pouco mais as expressões de classificação para verificar se você entendeu como usá-las. Tente alterar as dimensões de classificação definidas pelos objetos SortOptions em ProductSearchHandler.doProductSearch() executando uma classificação secundária em uma dimensão diferente. Ou tente alterar a direção de classificação para uma das dimensões de classificação.

Na próxima aula, você aprende a recuperar, excluir e reindexar documentos da API Search.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Python no App Engine