Гарантируют ли внутренние хиты Easticsearch всех попавших детей? - PullRequest
1 голос
/ 20 апреля 2020

Короче говоря, у меня есть индекс с текстовыми данными, извлеченными из PDF-файлов, сгруппированных в абзацы (называемые блоками). Каждый документ состоит из списка «блоков», где каждый «блок» содержит текст, номер страницы и координаты для ограничительной рамки. Например:

{
  blocks:[
    {
      text:"Some text",
      bbox:[0,1,2,3],
      page: 1
    },
    {
      text:"Some more text",
      bbox:[0,1,2,3],
      page: 2
    },
    {
      text:"Some other text",
      bbox:[0,1,2,3],
      page: 2
    },
  ],
  document_issuer: 12345
}

Я хотел бы получить список всех документов, где, например, появляется слово «ca sh» и всех блоков, где это появляется.

Мои сопоставления индекса следующее; обратите внимание, как «блоки» определяются как вложенный объект:

{
  "mappings" : {
    "properties" : {
      "blocks" : {
        "type" : "nested",
        "properties" : {
          "bbox" : {
            "type" : "float"
          },
          "page" : {
            "type" : "long"
          },
          "text" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          }
        }
      },
      "document_issuer" : {
        "type" : "long"
      }
    }
  }
}

Мой запрос выглядит так:

{
  'query':{
    'nested':{
      'path': 'blocks',
      'query': {
        'match':{'blocks.text': 'cash'}
      },
      'inner_hits': {}
    }
  }
}

Теперь удивительно то, что я получаю inner_hits назад, но не каждый Экземпляр ca sh в документах подсвечивается. Используя приведенный выше пример, я увидел бы, что inner_hits содержит, возможно, последние 2 блока, но не первый при поиске термина «текст».

Разве внутренние хиты не должны отображать каждый отдельный удар?

1 Ответ

1 голос
/ 20 апреля 2020

Если я правильно понимаю, вам интересно, почему ваш inner_hits не всегда возвращает каждый блок. Идея inner_docs, однако, именно в этом. Если в ваших вложенных блоках есть тонны block с, и поскольку они считаются автономными вложенными документами, inner_hits будет возвращать только те, которые соответствуют, не все из них, как в родительском, делают c.


Другими словами, если я синхронизирую c следующее, где только 1 блок содержит 'ca sh'

POST block_index/block
{"blocks":[{"text":"cash","bbox":[0,1,2,3],"page":1},{"text":"Some more text","bbox":[0,1,2,3],"page":2},{"text":"Some other text","bbox":[0,1,2,3],"page":2}],"document_issuer":12345}

, а затем ограничьте то, что я хочу видеть, используя _source

GET block_index/_search
{
  "_source": ["blocks.text", "inner_hits"],    <----
  "query": {
    "nested": {
      "path": "blocks",
      "query": {
        "match": {
          "blocks.text": "cash"
        }
      },
      "inner_hits": {
        "_source": "blocks.text"               <-----
      }
    }
  }
}

Я получу что-то вроде

{
  ...
  "hits" : {
    "total" : 1,
    "max_score" : 1.2800652,
    "hits" : [
      {
        "_index" : "block_index",
        "_type" : "block",
        "_id" : "0iQ9mXEBdiyDG0RsIKyn",
        "_score" : 1.2800652,
        "_source" : {
          "blocks" : [                         <----
            {
              "text" : "cash"
            },
            {
              "text" : "Some more text"
            },
            {
              "text" : "Some other text"
            }
          ]
        },
        "inner_hits" : {
          "blocks" : {
            "hits" : {
              "total" : 1,
              "max_score" : 1.2800652,
              "hits" : [
                {
                  "_index" : "block_index",
                  "_type" : "block",
                  "_id" : "0iQ9mXEBdiyDG0RsIKyn",
                  "_nested" : {
                    "field" : "blocks",
                    "offset" : 0
                  },
                  "_score" : 1.2800652,
                  "_source" : {
                    "text" : "cash"              <-----
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
}

Хотя я, возможно, захочу увидеть все мои блоки text с, я, скорее всего, заинтересован в тот, который фактически заставил целого родителя сделать c совпадение после выполнения моего вложенного запроса.

Надеюсь, это поможет.

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