Estoy usando Elasticsearch 7.6.0 y he paginado una de mis consultas. Parece que funciona bien, y puedo variar el número de resultados por página y la página seleccionada usando los parámetros de búsqueda from y size.

    query = 'sample query'
    items_per_page = 12
    page = 0

    es_query = {'query': {
        'bool': {
            'must': [{
                'multi_match': {
                    'query': query,
                    "fuzziness": "AUTO",
                    "operator": "and",
                    'fields': ['title^2', 'description']
                },
            }]
        }
    }, 'min_score': 5.0}

    res = es.search(index='my-index', body=es_query, size=items_per_page, from_=items_per_page*page)
    hits = sorted(res['hits']['hits'], key=lambda x: x['_score'], reverse=True)

    print(res['hits']['total']['value']) # This changes depending on the page provided

Me he dado cuenta de que la cantidad de resultados devueltos depende de la página proporcionada, lo que no tiene sentido para mí. La cantidad de resultados también oscila, lo que me confunde aún más: Página 0, 233 elementos. Página 1, 157 artículos. Página 2, 157 artículos. Página 3, 233 elementos ...

¿Por qué res['hits']['total']['value'] depende del tamaño y de los parámetros?

1
David Ferris 5 may. 2020 a las 01:49

3 respuestas

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html#request-body-search-track-total-hits

En general, el recuento total de aciertos no se puede calcular con precisión sin visitar todas las coincidencias, lo cual es costoso para consultas que coinciden con muchos documentos. El parámetro track_total_hits le permite controlar cómo debe rastrearse el número total de visitas. Dado que a menudo es suficiente tener un límite inferior del número de visitas, como "hay al menos 10000 visitas", el valor predeterminado se establece en 10,000. Esto significa que las solicitudes contarán el golpe total con precisión hasta 10,000 golpes. Es una buena compensación agilizar las búsquedas si no necesita el número exacto de resultados después de un cierto umbral.

Cuando se establece en verdadero, la respuesta de búsqueda siempre hará un seguimiento del número de resultados que coinciden con la consulta con precisión (por ejemplo, la relación total siempre será igual a "eq" cuando track_total_hits se establece en verdadero). De lo contrario, la "relación total" devuelta en el objeto "total" en la respuesta de búsqueda determina cómo debe interpretarse el "valor total". Un valor de "gte" significa que "total.value" es un límite inferior del total de coincidencias que coinciden con la consulta y un valor de "eq" indica que "total.value" es el recuento exacto.

-1
Alkis Kalogeris 5 may. 2020 a las 00:34

len(res['hits']['hits']) siempre devolverá el mismo número especificado en items_per_page (es decir, 12 en su caso), excepto en la última página, donde podría devolver un número menor o igual a 12.

Sin embargo, res['hits']['total']['value'] es la cantidad total de documentos en su índice , no la cantidad de resultados devueltos. Si aumenta el número de documentos, significa que se indexaron nuevos documentos entre la última consulta y la actual.

0
Val 5 may. 2020 a las 04:02

La búsqueda se distribuye y se envía a todos los nodos que contienen fragmentos que coinciden con los índices buscados. Luego, todos los resultados se fusionarán y devolverán. A veces, no se pueden buscar todos los fragmentos. Esto sucede cuando

  • El clúster está muy ocupado.
  • El fragmento específico no está disponible debido al proceso de recuperación
  • La búsqueda se ha optimizado y el fragmento se ha omitido.

En la respuesta, hay una sección _shards como esta:

{
    "took": 1,
    "timed_out": false,
    "_shards":{
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
    },
    "hits":{...}
}

Compruebe si hay algún valor distinto de 0 para fragmentos fallidos. Si es así, verifique los registros y el estado del clúster e índice.

0
ibexit 5 may. 2020 a las 07:00