首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Elasticsearch中的嵌套字段、通配符查询和聚合

Elasticsearch中的嵌套字段、通配符查询和聚合
EN

Stack Overflow用户
提问于 2021-06-27 14:20:09
回答 1查看 121关注 0票数 0

我有一个索引,收集各种网站的网络重定向数据。我使用一个嵌套的字段来收集数据,如下面的映射所示:

代码语言:javascript
运行
复制
"chain": {
    "type": "nested",
    "properties": {
      "url.position": {
        "type": "long"
      },
      "url.full": {
        "type": "text"
      },
      "url.domain": {
        "type": "keyword"
      },
      "url.path": {
        "type": "keyword"
      },
      "url.query": {
        "type": "text"
      }
    }
  }

可以想象,每个文档都包含一个url链数组,数组的大小等于web重定向的数量。我想获得基于通配符/正则表达式匹配到url.query字段的聚合。以下是一个示例查询:

代码语言:javascript
运行
复制
GET push_url_chain/_search
{
  "query": {
    "nested": {
      "path": "chain",
       "query": {
          "regexp": {
            "chain.url.query": "aff_c.*"
        }
      }
    }
 },
 "size": 0,
 "aggs": {
   "dataFields": {
      "nested": {
        "path": "chain"
      },
      "aggs": {
        "offers": {
          "terms": {
             "field": "chain.url.domain",
             "size": 30
           }
         }
       }
     }
    }
   }

上面的查询确实产生了聚合结果,但不是我想要的方式。我希望看到包含aff_c.*短语的urls的chain.url.domain聚合。现在,它正在查看链中的所有url,然后通过doc_count聚合存储桶,而不管该url/域是否具有特定的短语。我希望我已经能够清楚地解释这一点。如何获得结果以显示存储桶聚合,这些存储桶聚合包含aff_c.*短语与url的查询字段匹配的域。

我还想知道如何在我的通配符或正则表达式查询中使用=/。如果我在查询中使用上面的符号,它不会产生任何结果。

Tha

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-27 15:59:36

嵌套查询将返回嵌套文档与条件匹配的所有文档,您只能在inner_hits中获得匹配的嵌套文档。聚合是在这些文档之上应用的,所以所有的域都是以术语形式出现的

您需要使用nested aggregation来仅获取匹配的术语。

代码语言:javascript
运行
复制
{
  "size": 0, 
  "aggs": {
    "Name": {
      "nested": {
        "path": "chain"
      },
      "aggs": {
        "matched_doc": {
          "filter": {   --> filter for url
              "match_phrase_prefix": {
                "chain.url.query": "abc"
            }
          },
          "aggs": {
            "domain": {
              "terms": {
                "field": "chain.url.domain", -- terms for matched url
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

您可以使用match_phrase_prefix代替正则表达式。它有更好的性能。

生成令牌时的Standard analyzer删除"/“、"=”。因此,如果要使用正则表达式或通配符并查找它们,则需要使用关键字字段而不是文本字段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68148535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档