Этот действительно расстраивает меня.Я пытался найти решение довольно долгое время, но везде, где я пытаюсь найти вопросы от людей, спрашивающих то же самое, они либо хотят что-то немного другое (например, здесь или здесь или здесь ) или не получите ответ, который решает проблему (например, здесь ).
Что мне нужно
Я хочу знать, сколько всего поисков выполнено в моем поиске, независимо от типа используемого запроса.Я не говорю о количестве обращений, которые вы всегда получаете от ES, то есть о количестве документов, найденных по этому запросу, а о количестве вхождений объектов документов, соответствующих моему запросу .
Например, у меня может быть два документа с текстовым полем «описание», оба содержат слово hero
, но один из них содержит дважды .
Как в этом минимальномпример здесь:
Отображение индекса:
PUT /sample
{
"settings": {
"index" : {
"number_of_shards" : 1,
"number_of_replicas" : 0
}
},
"mappings": {
"doc": {
"properties": {
"name": { "type": "keyword" },
"description": { "type": "text" }
}
}
}
}
Два образца документов:
POST /sample/doc
{
"name": "Jack Beauregard",
"description": "An aging hero"
}
POST /sample/doc
{
"name": "Master Splinter",
"description": "This rat is a hero, a real hero!"
}
... и запрос:
POST /sample/_search
{
"query": {
"match": { "description": "hero" }
},
"_source": false
}
... что дает мне:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.22396864,
"hits": [
{
"_index": "sample",
"_type": "doc",
"_id": "hoDsm2oB22SyyA49oDe_",
"_score": 0.22396864
},
{
"_index": "sample",
"_type": "doc",
"_id": "h4Dsm2oB22SyyA49xDf8",
"_score": 0.22227617
}
]
}
}
Таким образом, есть два попадания ("total": 2
), что правильно, поскольку запрос соответствует двум документам. НО Я хочу знать, много раз мой запрос соответствовал внутри каждого документа (или его сумме), что в данном примере будет 3 , потому что второйдокумент содержал поисковый запрос дважды .
ВАЖНО : Это простой пример.Но я хочу, чтобы это работало для любого типа запроса и любого сопоставления, а также для вложенных документов с inner_hits
и всеми.
Я не ожидал, что это будет так сложно, потому что это должна быть информация, которую ES встречает во время поискав любом случае, верно?Я имею в виду, что документы ранжируются с больше попаданий внутри них выше , так почему я не могу подсчитать количество этих обращений?
Я испытываю желание называть их "внутренними попаданиями"", но это имя другой функции ES (см. ниже).
То, что я пытался / мог попробовать (но это некрасиво)
- Iможно использовать подсветку (что я и делаю в любом случае) и попытаться заставить маркер генерировать один подсветку для каждого"внутреннего соответствия" (и не объединять их), а затем постобработать завершить набор результатов поиска и подсчитать все основные моменты -> Конечно, это очень некрасиво , потому что (1) я действительно не хочупостобработка моих результатов и (2) я должен получить все результатов, чтобы сделать это, установив
size
на достаточно высокое значение, но на самом деле я хочу получить только количество результатов, запрошенныхклиент.Это было бы очень сложно! - Функция
inner_hits
звучит очень многообещающе, но это просто означает, что вы можете обрабатывать попадания во вложенные документы независимо, чтобы получить выделение для каждого из них.Я уже использую это для своих вложенных документов, но это не решает эту проблему, потому что (1) это сохраняется на уровне внутреннего попадания и (2) я хочу, чтобы это работало и с не вложенными запросами.
Есть ли способ добиться этого общим способом для произвольных запросов?Я был бы очень благодарен за любые предложения.Я даже за решение этой проблемы, работая с рейтингом или используя поля скриптов, что угодно.
Спасибо большое заранее!