elasticsearch термины агрегация неверны - PullRequest
0 голосов
/ 09 июля 2020

У меня есть поле, в котором хранится массив строк. разные документы содержат разный набор строк.

ex: "ftypes": ["PDF", "TXT", "XML"]

теперь я использовал этот агрегационный запрос для анализа использования каждого типа файла.

{
  "aggs": {
    "list": {
      "terms": {
        "field": "ftypes",
        "min_doc_count": 0,
        "size": 100000
      }
    }
  }
}

result ==>
{
    "took": 11,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 137265,
        "max_score": 0.0,
        "hits": []
    },
    "aggregations": {
        "list": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": "PDF",
                    "doc_count": 134475
                },
                {
                    "key": "TXT",
                    "doc_count": 21312
                },
                {
                    "key": "XML",
                    "doc_count": 6597
                },
                {
                    "key": "JPG",
                    "doc_count": 1233
                }
            ]
        }
    }
}

и результаты были правильными, как и ожидалось. но недавно я обновил это поле после удаления поддержки файлов XML. поэтому не из do c имеет тип файла XML. Я могу подтвердить это из этого запроса.

{
  "query": {
    "terms": {
      "ftypes": ["XML"]
    }
  }
}

result ===>

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 0,
        "max_score": null,
        "hits": []
    }
}

общее количество совпадений равно нулю. Странно то, что когда я снова выполняю вышеуказанный агрегационный запрос, я вижу XML как термин. do c count равно нулю.

{
    "took": 11,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 137265,
        "max_score": 0.0,
        "hits": []
    },
    "aggregations": {
        "list": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": "PDF",
                    "doc_count": 134475
                },
                {
                    "key": "TXT",
                    "doc_count": 21312
                },
                {
                    "key": "JPG",
                    "doc_count": 1233
                },
                {
                    "key": "XML",
                    "doc_count": 0
                }
            ]
        }
    }
}

откуда теперь берется этот XML термин, если он не существует ни в одном документе ?. есть ли кеш, который мне нужно удалить?

1 Ответ

1 голос
/ 09 июля 2020

Я предлагаю вам сослаться на this

ES использует Lucene под капотом. Они называются ghost terms. Здесь XML является призрачным термином в индексе.

Общая статистика терминов, используемая для оценки запросов, по-прежнему будет отражать удаленные термины и документы. Когда слияние завершается, статистика терминов внезапно приближается к своим истинным значениям, изменяя оценки попаданий. На практике это влияние незначительно, если только удаленные документы не имеют статистических данных, отличных от остальной части индекса.

Все последующие поиски просто пропускают любые удаленные документы. Только после слияния сегментов будут восстановлены байты, потребленные удаленными документами. Аналогичным образом, любые термины, которые встречаются только в удаленных документах (призрачные термины), не удаляются до слияния.

У ссылки достаточно причин для этого процесса.

Чтобы избежать этого термина из output, вам нужно установить min_doc_count:1, он будет загружать документы как минимум с одним документом

...