当前位置: 首页 > 知识库问答 >
问题:

Easticsearch内部命中是否保证返回所有命中子?

艾浩广
2023-03-14

简而言之,我有一个索引,其中包含从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
}

我想获得所有文件的列表,例如出现“现金”一词以及出现“现金”一词的所有块。

我的索引映射如下:;注意“块”是如何定义为嵌套对象的:

{
  "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回来了,但并不是文件中的每个现金实例都突出显示了。使用上面的例子,我看到inner_hits可能包含最后2个块,但在搜索术语“文本”时不包含第一个块。

难道内部命中不应该显示每一个命中吗?

共有1个答案

邢博文
2023-03-14

如果我理解正确,你想知道为什么你的inner_hits并不总是返回每个块。然而,inner_docs的想法正是如此。如果您的嵌套块中有大量的,并且由于它们被认为是独立的子文档,inner_hits只会返回那些匹配的块,而不是像父文档中那样返回所有块。

换句话说,如果我同步以下内容,其中只有1个块包含“现金”

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}

然后使用<code>_source</code>限制我想看到的内容

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,但我更可能对在执行嵌套查询后实际导致整个父文档匹配的块感兴趣。

希望这有帮助。

 类似资料:
  • 问题内容: 我正在尝试使用Java进行打字冒险类游戏,但是我至少需要一个与标题中的命令相似的命令,这是代码 每当用户键入除要求之外的其他内容时,都会发生默认情况,但我需要它返回到循环的开始,因此用户可以键入其他情况之一。 问题答案: 您可以使用该语句继续进行下一个迭代。 就是说,您的示例代码中没有看到循环。你可以用一个循环,或。该DO /时 循环至少执行一次- 这通常是你想要询问用户问题时该怎么办

  • 我正在编写外壳脚本,需要检查是否安装了终端应用程序。除非有更整洁的方法,否则我想使用TRY/CATCH命令来执行此操作。

  • 问题内容: 我正在使用Windows 8.1 64位,并通过nodejs.org的Windows Installer安装npm。每次我输入npm命令时,它总是显示以下消息:’CALL“ C:\ Program Files \ nodejs \ node.exe”“ C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ npm- cli.js

  • 我正在使用Windows8.164位,并从nodejs.org使用Windows Installer安装npm。每次我输入npm命令时,它总是显示这样一条消息:“调用”C:\program Files\nodejs\node.exe“”C:\program Files\nodejs\node_modules\npm\bin\npm-cli.js“前缀-g”不能识别为内部或外部命令、可操作程序或批处

  • 问题内容: 我正在尝试使用Java API通过Elasticsearch实现内部匹配,但是我找不到关于它的许多文档或其他人正在使用的示例。我的JSON搜索工作如下: 我在elasticsearch库中看到了InnerHitsBuilder和addInnerHit方法,但是找不到有关如何使用它们的文档。 问题答案: 请注意,ES源代码中有大量测试用例,正在测试每个功能,因此浏览ES代码是非常丰富的信

  • 据我所知,Java中的运算符比较对象的引用()。 此值是中方法的默认实现返回的值。 方法有一个实现说明: 为什么和 而且,一个极度厌恶风险的人如何确保上面的假阳性永远不会发生?如果类至少有一个非静态字段,则可以重写和。但是,如果不是这样(就像上面的类一样)呢? 你能解释一下我在这里漏掉了什么吗? 为添加API注释(取自Silvio的答案): 这通常是通过将对象的内部地址转换为整数来实现的,但Jav