gpt4 book ai didi

java - 如何使用 spring elasticsearch 计算某个字段出现的次数?

转载 作者:行者123 更新时间:2023-12-01 21:18:36 24 4
gpt4 key购买 nike

我正在运行一个每 X 分钟运行一次的 cronjob,以找出最受欢迎的标签(主题标签)。我使用 Fluentd 将用户 Activity 存储在 Elasticsearch 中,假设用户搜索一个术语,该术语将存储在 elasticsearch 中,如下所示:

{ activity: "search", user: X, searchTerm: "XYZ"}

我有一个针对标签的 Activity 。每次用户搜索标签时,它都会作为 Activity 插入。这样我就可以找出用户喜欢的标签以及总体上最受欢迎的标签。

这是我的 ES 的结构:

{
"_index":"user_activity",
"_type":"user_activity",
"_id":"AVcokbsXKR86Bn8FzoFU",
"_score":1.0,
"_source":{
"user":{
"userId":4,
"name":"Another one",
},
"activity":"CREATE",
"date":1473854418419,
"article":{
{user who posted article...}
... Article data (title, etc...)
// Tags associated to this article
"tags":[
{
"tagId":23,
"tagName":"randomTagName"
}
],
},
}
},
{
"_index":"user_activity",
"_type":"user_activity",
"_id":"AVcomLEnKR86Bn8FzoFu",
"_score":1.0,
"_source":{
"user":{
"userId":1,
"name":"MEATTTT DAMOENNNN",
},
"activity":"TAG_SEARCH",
"date":1473854873951,
"tag":"photos"
}
}
... There can be different types of activities

如您所见,有不同的 Activity 类型。我正在尝试查询 ES 并让它返回每个唯一标签的搜索总量。如果您查看TAG_SEARCH对象,您可以看到它有一个字段标签。我正在尝试查找唯一标签值的 TAG_SEARCH Activity 总数!

这是我使用 NativeSearchQueryBuilder 尝试过的操作。

SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.withSearchType(COUNT)
.withIndices("user_activity").withTypes("user_activity")
.addAggregation(terms("activity").field("activity"))

它的作用是返回每个唯一 Activity 值的文档总数。因此上述 JSON 的结果将是:

"buckets" : [ {
"key" : "create",
"doc_count" : 1
}, {
"key" : "tag_search",
"doc_count" : 1
}
]

但我想要得到的是:

"buckets" : [ {
"key" : "tag",
"value": "TagNameGoesHere",
"doc_count" : 4
}, {
"key" : "tag",
"value": "AnotherTagNameGoesHere",
"doc_count" : 10
}
]

如何找出 Activity :TAG_SEARCH所在的唯一标记:X值的总数?

我希望 SearchQuery 看起来像这样:

SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.withSearchType(COUNT)
.withIndices("user_activity").withTypes("user_activity")
.addAggregation(terms("activity").value("TAG_SEARCH"))
.addAggregation(terms("tag")) // Count no docs per tag

最佳答案

您只需要对 activity 字段进行查询,然后对 tag 字段进行聚合。

SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("activity", "TAG_SEARCH"))
.withSearchType(COUNT)
.withIndices("user_activity")
.withTypes("user_activity")
.addAggregation(AggregationBuilders.terms("tags").field("tag"));

相应的原始 JSON 查询就是这个

POST user_activity/user_activity/_search?search_type=count
{
"query": {
"match": {
"activity": "TAG_SEARCH"
}
},
"aggs": {
"tags": {
"terms": {
"field": "tag"
}
}
}
}

关于java - 如何使用 spring elasticsearch 计算某个字段出现的次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39502267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com