我正在尝试获取与查询匹配的文档中的令牌总数。我尚未定义任何自定义映射,并且要获取令牌计数的字段类型为"字符串"。
我尝试了以下查询,但它给出了一个非常大的数字,大约为 10^20,这不是我的数据集的正确答案。
curl -XPOST 'localhost:9200/nodename/comment/_search?pretty' -d '
{
"query": {
"match_all": {}
},
"aggs": {
"tk_count": {
"sum": {
"script": "_index["body"].sumttf()"
}
}
},
"size": 0
}
知道如何获得所有令牌的正确计数吗?(我不需要每个术语的计数,而是总计数)。
这对我有用,这是你需要的吗?
我的解决方案不是在查询上获取令牌计数(如另一个答案中所建议的那样使用tk_count
聚合),而是使用 token_count
数据类型将令牌计数存储在索引中,以便我可以获取查询结果中返回的"name.stored_length"值。
token_count
是一个"多字段",它一次处理一个字段(即"名称"字段或"正文"字段)。我稍微修改了示例以存储"name.stored_length"
请注意,在我的示例中,它不计算令牌的基数(即非重复值),而是计算总令牌数;"约翰·约翰·多伊"中有 3 个代币;"name.stored_length"===3;(即使其计数不同标记仅为 2)。请注意,我要求具体"stored_fields" : ["name.stored_length"]
最后,您可能需要重新更新文档(即发送PUT
),或任何技术来获取所需的值!在这种情况下,我PUT
"John John Doe",即使它已经在 elasticsearch 中POST/PUT
;在将令牌添加到映射后,直到再次PUT
后,令牌才被计算在内。!
PUT test_token_count
{
"mappings": {
"_doc": {
"properties": {
"name": {
"type": "text",
"fields": {
"stored_length": {
"type": "token_count",
"analyzer": "standard",
//------------------v
"store": true
}
}
}
}
}
}
}
PUT test_token_count/_doc/1
{
"name": "John John Doe"
}
现在我们可以查询或搜索结果,并将结果配置为包含name.stored_length
字段(既是多字段又是存储字段!
GET/POST test_token_count/_search
{
//------------------v
"stored_fields" : ["name.stored_length"]
}
搜索结果应包括令牌总数,named.stored_length
...
{
...
"hits": {
...
"hits": [
{
"_index": "test_token_count",
"_type": "_doc",
"_id": "1",
"_score": 1,
"fields": {
//------------------v
"name.stored_length": [
3
]
}
}
]
}
}
似乎您想在正文字段中检索cardinality
的总令牌。
在这种情况下,您可以使用如下所示cardinality aggregation
。
curl -XPOST 'localhost:9200/nodename/comment/_search?pretty' -d '
{
"query": {
"match_all": {}
},
"aggs": {
"tk_count": {
"cardinality" : {
"field" : "body"
}
}
},
"size": 0
}
有关详细信息,请参阅此官方文档