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

Nested Fields, Wildcard Queries and Aggregations in Elasticsearch

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

"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 重定向的数量。我想获得基于 wildcard/regexp 与 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.* 短语的 url 的 chain.url.domain 聚合。现在它正在查看链中的所有 url,然后通过 doc_count 聚合桶,而不管 url/domain 是否具有特定短语。我希望我能够清楚地解释这一点。如何让我的结果显示包含域的存储桶聚合,这些域的 aff_c.* 词组与 url.

的查询字段匹配

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

嵌套查询 returns 嵌套文档符合条件的所有文档,您只在 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 在生成令牌时删除“/”、“=”。所以如果你想使用正则表达式或通配符来查找这些,你需要使用关键字字段而不是文本字段。