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

时间:2019-05-09 10:58:09

标签: elasticsearch

这真的让我感到沮丧。我尝试了很长时间才找到解决方案,但是无论我在哪里寻求人们的相同要求,他们要么想要一些不同的东西(例如herehere或{{3 }})或没有得到解决问题的答案(例如here)。

我需要的

我想知道我的搜索总共有多少次命中,而与所使用的查询类型无关。我不是在[strong>不是谈论您总是从ES获得的点击数,即为该查询找到的文档数,而是与我的查询匹配的文档特征的出现次数 em>。
例如,我可以有两个文档,其文本字段为“描述”,都包含单词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在搜索过程中遇到的信息,对吗?我的意思是,它在文档中按 more 个命中 high 个命中的文档排名,那么为什么我无法获得这些命中的计数呢?
我很想称它们为“内部热门”,但这是另一种ES功能的名称(请参见下文)。

我尝试过的方法/可以尝试的方法(但是很丑)

  • 我可以使用突出显示(无论如何我都会这样做),并尝试使突出显示器为每个“内部匹配”生成一个突出显示(并且不要将它们组合在一起) ,然后对搜索结果的 complete 集进行后处理并计算所有亮点->当然,这是非常丑陋,因为( 1)我并不是真的想对结果进行后处理,并且(2)必须通过将size设置为足够高的值来获得所有结果,但是实际上我只想获取客户要求的结果数量。这会带来很多开销!
  • 功能inner_hits听起来很有前途,但这仅意味着您可以独立处理嵌套文档中的匹配,以突出显示每个匹配。我已经将它用于我的嵌套文档,但是它不能解决这个问题,因为(1)它在内部命中级别上仍然存在,并且(2)我也希望它也可用于非嵌套查询。

是否有一种通用方法可以对任意查询实现此目的?如果有任何建议,我将不胜感激。我什至不愿意通过修改排名或使用脚本字段来解决问题。

非常感谢!

1 个答案:

答案 0 :(得分:0)

由于性能太差,我绝对不建议将其用于任何实际用途,但是在解释API结果中的频率计算一词中,该数据在技术上是可用的。有关概念性说明,请参见What is Relevance?,有关用法,请参见Explain API