这真的让我感到沮丧。我尝试了很长时间才找到解决方案,但是无论我在哪里寻求人们的相同要求,他们要么想要一些不同的东西(例如here或here或{{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功能的名称(请参见下文)。
我尝试过的方法/可以尝试的方法(但是很丑)
size
设置为足够高的值来获得所有结果,但是实际上我只想获取客户要求的结果数量。这会带来很多开销!inner_hits
听起来很有前途,但这仅意味着您可以独立处理嵌套文档中的匹配,以突出显示每个匹配。我已经将它用于我的嵌套文档,但是它不能解决这个问题,因为(1)它在内部命中级别上仍然存在,并且(2)我也希望它也可用于非嵌套查询。是否有一种通用方法可以对任意查询实现此目的?如果有任何建议,我将不胜感激。我什至不愿意通过修改排名或使用脚本字段来解决问题。
非常感谢!
答案 0 :(得分:0)
由于性能太差,我绝对不建议将其用于任何实际用途,但是在解释API结果中的频率计算一词中,该数据在技术上是可用的。有关概念性说明,请参见What is Relevance?,有关用法,请参见Explain API。