【问题标题】:Nested Fields, Wildcard Queries and Aggregations in ElasticsearchElasticsearch 中的嵌套字段、通配符查询和聚合
【发布时间】:2021-06-27 06:20:09
【问题描述】:

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

"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 字段来获取聚合。这是一个示例查询:

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.* 短语的网址的chain.url.domain 聚合。现在它正在查看链中的所有 url,然后通过 doc_count 聚合存储桶,无论该 url/域是否具有特定的短语。我希望我能够清楚地解释这一点。如何让我的结果显示包含与 url 的查询字段具有 aff_c.* 短语匹配的域的存储桶聚合。

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

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

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

    您需要使用nested aggregation 仅获取匹配的字词。

    {
      "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 在生成令牌时删除“/”、“=”。因此,如果您想使用正则表达式或通配符并查找这些,则需要使用关键字字段而不是文本字段。

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 1970-01-01
      • 2017-09-13
      • 2015-07-30
      • 2016-05-29
      • 2020-10-10
      • 2023-04-03
      • 1970-01-01
      • 2018-06-01
      相关资源
      最近更新 更多