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

Elasticsearch中任意查询的“实际命中”(不仅仅是匹配的文档)计数

井斌斌
2023-03-14

这个问题真的让我很沮丧。我很长一段时间都想找到一个解决方案,但无论我在哪里试图找到人们提出的相同问题,他们要么想要一些不同的东西(比如这里或这里),要么得不到解决问题的答案(比如这里)。

我需要什么

我想知道我的搜索总共有多少命中,与所使用的查询类型无关。我说的不是您总是从ES得到的命中数,也就是为该查询找到的文档数,而是匹配我的查询的文档特征的出现次数。< br >例如,我可以有两个带有文本和文本字段“description”的文档,两个文档都包含单词< code>hero,但其中一个包含两次。< br >就像这个最小的例子:

索引映射:

PUT /sample
{
    "settings": {
        "index" : {
            "number_of_shards" : 1,
            "number_of_replicas" : 0
        }
    },
    "mappings": {
        "doc": {
            "properties": {
                "name": { "type": "keyword" },
                "description": { "type": "text" }
            }
        }
    }
}

两个html" target="_blank">示例文档:

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次,因为第二个文档包含了两次搜索词
重要信息:这只是一个简单的例子。但我希望它适用于任何类型的查询和映射,也适用于具有<code>inner_hits</code>的嵌套文档
我没想到这会如此困难,因为无论如何,这一定是ES在搜索过程中遇到的信息,对吧?我的意思是,它将文档中点击次数较多的文档排序得更高,所以为什么我不能得到这些点击次数的计数
我想把它们称为“内部命中”,但这是另一个ES功能的名称(见下文)。

我尝试过/可以尝试的(但它很丑陋)

  • 我可以使用突出显示(无论如何我都会这样做),并尝试使荧光笔为每个“内部匹配”生成一个突出显示(并且不要将它们组合在一起),然后对完整的搜索结果集进行后处理并计算所有突出显示 -

对于任意查询,有没有一种通用的方法来实现这一点?我将非常感谢任何建议。我甚至打算通过修改排名或使用脚本字段等方式来解决这个问题。

多谢了!

共有1个答案

薄伟彦
2023-03-14

由于糟糕的性能,我绝对不建议将其用于任何实际用途,但在解释API的结果中,该数据在术语频率计算中是技术上可用的。参见什么是相关性?概念解释和使用解释API。

 类似资料:
  • 问题内容: 我想获取与“ statusCode”不匹配的结果:200 为了匹配字段中的文本,您可以使用 我尝试过这样的事情: 根据:https : //www.elastic.co/guide/zh- CN/elasticsearch/reference/current/query-dsl-bool- query.html 问题答案: 试试这个

  • 我希望得到与“StatusCode”不匹配的结果:200 为了匹配您使用的字段中的文本 我试过这样的方法: 根据:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

  • 问题内容: 我们可以像这样在特定document.field中搜索所有单词: 这将搜索词,并在该领域,从而只返回这些文档将在所有这些词场。 但是我想做的却有些不同。 我想进行查找,以便如果该文档字段的所有单词都出现在我的搜索查询中,则它将返回该文档。 例如 假设Elasticsearch数据库中有一个文档 现在,如果我搜索“ a”,它将返回该文档,因为document.title中的所有单词确实存

  • 问题内容: 我正在用查询查询我的elasticsearch索引。查询本身的结构与此类似 我希望能够确定所有这些查询中哪一个是与结果匹配的查询。是否有内置的elasticsearch方法允许这样做,还是我必须手动进行? 问题答案: 您可以使用命名查询,然后在结果中获得匹配的查询的名称。 然后,在结果中,您将获得一个数组,其中包含与文档匹配的查询的名称。

  • 主要集合是零售商,其中包含用于商店的数组。每个商店都包含一系列优惠(您可以在此商店购买)。这提供了具有数组大小的数组。(见下面的例子) 现在我试图找到所有的优惠,这是在大小。 我尝试了这个查询: 我期待这样的输出: 但是,我的查询的输出还包含与XS、X和M不匹配的offer。 如何强制MongoDB只返回符合我查询的报价? 问候和感谢。

  • 在1.0函数中使用cosmos db sdk。UpsertDocumentAsync抛出错误“从文档中提取的PartitionKey与标头中指定的不匹配”。在我的REST Api中,使用相同的cosmos db sdk V2.1.3,一切都可以正常工作。软件包的唯一区别是NewtonSoft.json在函数方面是10.0.2版本,在REST API方面是11.0.2版本。我想知道这是否与Netwo