Elastic Search Aggregation with Filter 无法过滤聚合
Elastic Search Aggregation with Filter unable to filter aggregation
您好,我们正在做一个项目,如果有人能提供帮助,那我们就卡住了,那真是太好了
GET xyxz/_search
{
"size":0,
"aggs":{
"company":{
"terms":{
"field":"skills.name.keyword",
"size":10
}
}
},
"query":{
"bool":{
"must":[
],
"filter":[
],
"should":[
{
"wildcard":{
"skills.name":{
"value":"jav*"
}
}
}
],
"must_not":[
]
}
}
}
新更新的查询
POST INDEX/_search
{
"size": 0,
"aggs": {
"my_terms": {
"terms": {
"script": {
"inline": """
if(doc['skills.name.keyword'].size()>0)
{
if(doc['skills.name.keyword'].value.contains("jav"))
{
return doc['skills.name.keyword'];
}
}
"""
},
"size": 10
}
}
}
}
示例响应
{
"took" : 7469,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 10000,
"relation" : "gte"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"my_terms" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 871,
"buckets" : [
{
"key" : "java",
"doc_count" : 121
},
{
"key" : "javascript",
"doc_count" : 77
},
{
"key" : "sql",
"doc_count" : 62
},
{
"key" : "core java",
"doc_count" : 46
},
{
"key" : "xml",
"doc_count" : 43
},
{
"key" : "software development",
"doc_count" : 36
},
{
"key" : "requirements analysis",
"doc_count" : 34
},
{
"key" : "microsoft sql server",
"doc_count" : 31
},
{
"key" : "java enterprise edition",
"doc_count" : 30
},
{
"key" : "jquery",
"doc_count" : 27
}
]
}
}
}
留言:
我想非常感谢您帮助我,几周以来我们一直在通过堆栈溢出进行通信。
再次感谢堆栈溢出社区
解决方案:聚合结果:
Post 收到你的映射,下面是你正在寻找的我使用 Scripted Terms Aggregation
:
的地方
POST <your_index_name>/_search
{
"size": 0,
"aggs": {
"my_terms": {
"terms": {
"script": {
"inline": """
if(doc['skills.name.keyword'].size()>0){ <---- Note this logic I've added
if(doc['skills.name.keyword'].value.contains("jav")){
return doc['skills.name.keyword'];
}
}
"""
},
"size": 10
}
}
}
}
请注意,我对 Java 使用了 String
class 的 contains
方法。您可以根据您要查找的内容更改逻辑,以便只过滤掉您想要的聚合值。
您可能必须过滤聚合响应的原因是您的示例文档可能具有多种技能,如下例所示:
{
"skills": [
{
"name": "java"
},
{
"name": "javascript"
},
{
"name": "c++"
}
]
}
请注意,您的解决方案是 object
数据类型。
查询结果 return 整个文档,然后聚合查询 运行 在这些结果之上。
所以如您所见,上述文档也有 c++
并且它也将包含在聚合查询中。在 hits
上实现聚合的唯一方法是使用我提到的脚本逻辑。
自动竞争问题:
第二个问题是自动完成功能,为此您需要阅读一些相关内容,因为有多种方法可以实现它。
不过,我建议您先了解 Analysis phase of Elasticsearch, understand what an Analyzer is and its various parts that constitute Analyzer, finally moving on to reading about Edge n-grams tokenizer and Completion Suggester。
掌握所有这些概念需要一段时间,但一旦掌握了窍门,实施起来就相对容易了。
请注意,我不推荐使用通配符查询。一旦您了解并了解了 Ngram 或 Edge Ngram 分词器,您的查询就可以像 jav
的简单匹配查询一样简单。但是请务必阅读链接中提到的概念。
让我知道这是否有帮助,以及您是否需要进一步的说明。
您好,我们正在做一个项目,如果有人能提供帮助,那我们就卡住了,那真是太好了
GET xyxz/_search
{
"size":0,
"aggs":{
"company":{
"terms":{
"field":"skills.name.keyword",
"size":10
}
}
},
"query":{
"bool":{
"must":[
],
"filter":[
],
"should":[
{
"wildcard":{
"skills.name":{
"value":"jav*"
}
}
}
],
"must_not":[
]
}
}
}
新更新的查询
POST INDEX/_search
{
"size": 0,
"aggs": {
"my_terms": {
"terms": {
"script": {
"inline": """
if(doc['skills.name.keyword'].size()>0)
{
if(doc['skills.name.keyword'].value.contains("jav"))
{
return doc['skills.name.keyword'];
}
}
"""
},
"size": 10
}
}
}
}
示例响应
{
"took" : 7469,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 10000,
"relation" : "gte"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"my_terms" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 871,
"buckets" : [
{
"key" : "java",
"doc_count" : 121
},
{
"key" : "javascript",
"doc_count" : 77
},
{
"key" : "sql",
"doc_count" : 62
},
{
"key" : "core java",
"doc_count" : 46
},
{
"key" : "xml",
"doc_count" : 43
},
{
"key" : "software development",
"doc_count" : 36
},
{
"key" : "requirements analysis",
"doc_count" : 34
},
{
"key" : "microsoft sql server",
"doc_count" : 31
},
{
"key" : "java enterprise edition",
"doc_count" : 30
},
{
"key" : "jquery",
"doc_count" : 27
}
]
}
}
}
留言: 我想非常感谢您帮助我,几周以来我们一直在通过堆栈溢出进行通信。 再次感谢堆栈溢出社区
解决方案:聚合结果:
Post 收到你的映射,下面是你正在寻找的我使用 Scripted Terms Aggregation
:
POST <your_index_name>/_search
{
"size": 0,
"aggs": {
"my_terms": {
"terms": {
"script": {
"inline": """
if(doc['skills.name.keyword'].size()>0){ <---- Note this logic I've added
if(doc['skills.name.keyword'].value.contains("jav")){
return doc['skills.name.keyword'];
}
}
"""
},
"size": 10
}
}
}
}
请注意,我对 Java 使用了 String
class 的 contains
方法。您可以根据您要查找的内容更改逻辑,以便只过滤掉您想要的聚合值。
您可能必须过滤聚合响应的原因是您的示例文档可能具有多种技能,如下例所示:
{
"skills": [
{
"name": "java"
},
{
"name": "javascript"
},
{
"name": "c++"
}
]
}
请注意,您的解决方案是 object
数据类型。
查询结果 return 整个文档,然后聚合查询 运行 在这些结果之上。
所以如您所见,上述文档也有 c++
并且它也将包含在聚合查询中。在 hits
上实现聚合的唯一方法是使用我提到的脚本逻辑。
自动竞争问题:
第二个问题是自动完成功能,为此您需要阅读一些相关内容,因为有多种方法可以实现它。
不过,我建议您先了解 Analysis phase of Elasticsearch, understand what an Analyzer is and its various parts that constitute Analyzer, finally moving on to reading about Edge n-grams tokenizer and Completion Suggester。
掌握所有这些概念需要一段时间,但一旦掌握了窍门,实施起来就相对容易了。
请注意,我不推荐使用通配符查询。一旦您了解并了解了 Ngram 或 Edge Ngram 分词器,您的查询就可以像 jav
的简单匹配查询一样简单。但是请务必阅读链接中提到的概念。
让我知道这是否有帮助,以及您是否需要进一步的说明。