1

我正在尝试获取与查询匹配的文档中的令牌总数。我没有定义任何自定义映射,并且我想要获取令牌计数的字段是“字符串”类型。

我尝试了以下查询,但它给出了一个非常大的数字,大约为 10^20,这不是我的数据集的正确答案。

curl -XPOST 'localhost:9200/nodename/comment/_search?pretty' -d '
{
   "query": {
      "match_all": {}
   },
   "aggs": {
      "tk_count": {
         "sum": {
            "script": "_index[\"body\"].sumttf()"
         }
      }
   },
   "size": 0
}

知道如何获得所有令牌的正确计数吗?(我不需要每个学期的计数,而是总计数)。

4

2 回答 2

2

似乎您想cardinality在正文字段中检索总令牌。

在这种情况下,您可以cardinality aggregation像下面这样使用。

curl -XPOST 'localhost:9200/nodename/comment/_search?pretty' -d '
{
    "query": {
        "match_all": {}
    },
    "aggs": {
        "tk_count": {
            "cardinality" : {
                "field" : "body"
            }
        }
    },
    "size": 0
}

详细信息请看这个官方文档

于 2016-02-26T01:57:27.127 回答
2

这对我有用,是你需要的吗?

我的解决方案不是在查询中获取令牌计数(使用tk_count聚合,如另一个答案中所建议的那样),而是使用数据类型将令牌计数存储在索引中token_count,这样我就可以获得查询结果中返回的“name.stored_length”值。

token_count是一个“多字段”,它一次只处理一个字段(即“名称”字段或“正文”字段)。我稍微修改了示例以存储“name.stored_length”

请注意,在我的示例中,它计算令牌的基数(即不同的值),它计算总令牌;“John John Doe”中有 3 个标记;"name.stored_length"===3; (即使它的计数不同的标记只有 2)。注意我要求具体"stored_fields" : ["name.stored_length"]

最后,您可能需要重新更新您的文档(即发送一个PUT),或任何技术来获得您想要的值!在这种情况下,我PUT是“John John Doe”,即使它已经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
          ]
        }
      }
    ]
  }
}
于 2018-10-27T19:06:22.537 回答