Что показывает общее значение в запросе _search в результате эластичного поиска? - PullRequest
1 голос
/ 08 января 2020

Когда мы вызываем эластичный поиск, произнесите следующее: POST https: //// _ search with body:

{
      "from": 0,
      "size": 1,
      "query": {
        "bool": {
          "must": [
            {
              "range": {
                "createdAt": {
                  "gt": "2019-11-11T10:00:00"
                }
              }
            }

          ]
        }
      },
      "sort": [
        {
            "createdAt" : {
                "order" : "desc"
            }
        }
        ]
}

Я вижу, что получаю только 1 результат, поскольку нумерация страниц установлена ​​на 1, но общее количество внутри Хиты в ответ показывает 2. Это ответ, который я получаю:

{
    "took": 4,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 2,
            "relation": "eq"
        },
        "max_score": null,
        "hits": [
            {
                "_index": “<index-name>”,
                "_type": "_doc",
                "_id": "5113c843-dff3-499f-a12e-44c7ac103bcf_0",
                "_score": null,
                "_source": {
                    "oId": "5113c843-dff3-499f-a12e-44c7ac103bcf",
                    "oItemId": 0,
                    "createdAt": "2019-11-13T11:00:00"
                },
                "sort": [
                    1573642800000
                ]
            }
        ]
    }
}

Разве всего не захватывает часть нумерации страниц? И это заботится только о запросе отчета? Он должен показывать общее количество элементов, соответствующих запросу, независимо от набора страниц, верно?

1 Ответ

2 голосов
/ 08 января 2020

Да, вы правы, что total не охватывает часть нумерации страниц, а просто заботится о отчете о запросе ie. независимо от того, совпадает ли общее количество документов по данному запросу.

Точнее, это объясняется в официальных документах ES .

total (Object ) Метаданные о количестве возвращаемых документов. Возвращаемые параметры включают в себя:

значение: общее количество возвращенных документов. отношение: указывает, вернулось ли количество документов. Возвращаемые значения:

eq: Accurate gte: нижняя граница, включая возвращенные документы

Это означает, что общее количество возвращенных документов отсутствует, но в качестве примера для нумерации страниц задано значение 1 внутренние совпадения имеют только 1 документ. Вы можете легко проверить это понимание, создав пример примера, как показано ниже:

Создайте пример индекса только с одним текстовым полем:

URL:- http://localhost:9200/{your-index-name}/ --> PUT method

{
    "mappings": {
        "properties": {
            "name": {
                "type": "text"
            }
        }
    },
    "settings": {
        "index": {
            "number_of_shards": "1",
            "number_of_replicas": "1"
        }
    }
}

Один раз Указанный выше индекс создается индексом ниже 4 документов:

URL: - http://localhost:9200/{your-index-name}/_doc/{1,2,like..} --> POST method

  {
        "name": "foo 1"
    }

{
    "name": "foo bar"
}

{
    "name": "foo"
}

{
    "name": "foo 2"
}

Теперь, когда вы нажимаете ниже поискового запроса без нумерации страниц:

{

    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "name": "foo"
                    }
                }
            ]
        }
    }
}

Это дает следующий ответ:

{
    "took": 9,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 4, --> Note 4 here
            "relation": "eq"
        },
        "max_score": 0.12199639,
        "hits": [
            {
                "_index": "59638303",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.12199639,
                "_source": {
                    "name": "foo"
                }
            },
            {
                "_index": "59638303",
                "_type": "_doc",
                "_id": "3",
                "_score": 0.12199639,
                "_source": {
                    "name": "foo"
                }
            },
            {
                "_index": "59638303",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.09271725,
                "_source": {
                    "name": "foo bar"
                }
            },
            {
                "_index": "59638303",
                "_type": "_doc",
                "_id": "4",
                "_score": 0.09271725,
                "_source": {
                    "name": "foo 1"
                }
            }
        ]
    }
}

Но когда вы нажимаете поисковый запрос с нумерацией страниц:

{
    "from": 0,
    "size": 1,--> note size 1
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "name": "foo"
                    }
                }
            ]
        }
    }
}

, это дает ниже ответ

{
    "took": 23,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 4, --> this is still 4
            "relation": "eq"
        },
        "max_score": 0.12199639,
        "hits": [
            {
                "_index": "59638303",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.12199639,
                "_source": {
                    "name": "foo"
                }
            }
        ]
    }
}

Сейчас В приведенном выше запросе вы можете изменить размер и проверить, что только внутренний массив попаданий получает изменение, но внешний объект попаданий, который содержит общее количество, всегда остается таким же, как 4 , это подтверждает, что ваше понимание верно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...