gpt4 book ai didi

elasticsearch - 具有过滤器的 Elasticsearch 聚合无法过滤聚合

转载 作者:行者123 更新时间:2023-12-02 23:46:58 25 4
gpt4 key购买 nike

您好,我们正在研究一个项目,如果有人可以提供帮助,那么我们会陷入困境,那真的很棒

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
}
]
}
}
}

信息 :
我要说非常感谢,感谢您的帮助,自从几周以来我们一直在通过堆栈溢出进行通信。
再次感谢堆栈溢出社区

最佳答案

解决方案:聚合结果:

发布收到您的映射后,下面是您在寻找我使用 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使用了 contains类的 String方法。您可以根据要查找的内容更改逻辑,以便仅过滤出想要的聚合值。

您可能必须过滤聚合响应的原因是由于您的示例文档可以具有以下示例所示的多种技能:
{
"skills": [
{
"name": "java"
},
{
"name": "javascript"
},
{
"name": "c++"
}
]
}

请注意,您的解决方案是 object数据类型。

查询结果将返回整个文档,然后聚合查询将在这些结果之上运行。

如您所见,上面的文档也有 c++,它也将包含在聚合查询中。实现 hits上聚合的唯一方法是利用我提到的脚本化逻辑。

自动竞争问题:

第二个问题是自动完成功能,为此您需要阅读一些有关它的信息,因为有多种方法可以实现它。

但是,我建议您首先了解Elasticsearch的 Analysis阶段,了解 Analyzer是什么以及组成Analyzer的各个部分,最后继续阅读 Edge n-grams tokenizerCompletion Suggester

掌握所有这些概念将花费一些时间,但是一旦掌握了这些概念,就可以轻松实现它。

请注意,我不建议使用通配符查询。了解并了解Ngram或Edge Ngram标记生成器后,您的查询就可以像 jav的简单匹配查询一样简单。但是请务必阅读链接中提到的概念。

让我知道这是否有帮助以及您是否需要进一步说明。

关于elasticsearch - 具有过滤器的 Elasticsearch 聚合无法过滤聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60588485/

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