我有一个使用构面的搜索页面。当用户在搜索栏中输入字词或选中左侧列上的构面复选框时,这会触发我们的 Elasticsearch 索引中的新搜索。
elasticsearch - 使用Elastic Search的自定义构面-LMLPHP

这是构面的工作方式。我们的查询包括每个构面类别的汇总。例如,对名字类别的聚合响应包括结果集中的所有名字,以及每个名字出现在结果集中的次数。由于这是一个Vuejs应用程序,并且构面数据是一个响应变量,因此构面会使用新的键列表和括号中的文档计数进行更新。

elasticsearch - 使用Elastic Search的自定义构面-LMLPHP

这是有问题的,因为用户只能在每个构面上选择一个复选框。用户选择一个复选框后,其他选项就会消失,因为新结果集和聚合响应现在仅限于满足所选复选框的文档。

我认为我需要做的是自定义聚合,但是我可能错了,并且有一种更简单或更聪明的方法。让我知道是否是这种情况。

我想我需要重构,以便当用户在foo类别中选择一个复选框时,聚合将在不同的结果集上进行操作,该结果集考虑了搜索栏术语和所有其他类别中的检查值,但忽略了用户在foo类。如何在Elastic中完成?

要求是选中一个复选框立即触发新的搜索以更新表和其他构面类别的内容。

最终,我需要使用Elastic的JAVA高级REST客户端来实现这一点,但是即使只是cURL示例也将有所帮助。

这是我当前的汇总查询...

        for (String colName : colNames) {
        sourceBuilder.aggregation(AggregationBuilders.terms(colName)
                .field(colName + ".keyword"));
    }

最佳答案

如果我理解您的问题是对的,那么您希望您的字词汇总与搜索查询无关。

您可以使用global aggregation





对应:

{
  "index50" : {
    "mappings" : {
      "properties" : {
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }

数据:
 "hits" : [
      {
        "_index" : "index50",
        "_type" : "_doc",
        "_id" : "v8MR3XABAqtoal9HOsoo",
        "_score" : 1.0,
        "_source" : {
          "name" : "john"
        }
      },
      {
        "_index" : "index50",
        "_type" : "_doc",
        "_id" : "wMMR3XABAqtoal9HU8rs",
        "_score" : 1.0,
        "_source" : {
          "name" : "doe"
        }
      }
    ]

查询:
{
  "query": {
    "match": {
      "name": "john"
    }
  },
  "aggs": {
    "name_global_faucet": {
      "global": {},--> will return terms from all documents
      "aggs": {
        "first_name": {
          "terms": {
            "field": "name.keyword",
            "size": 10
          }
        }
      }
    },
    "name_faucet": {
      "terms": {--> will return terms from documents returned in query
        "field": "name.keyword",
        "size": 10
      }
    }
  }
}

结果:
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.6931472,
    "hits" : [
      {
        "_index" : "index50",
        "_type" : "_doc",
        "_id" : "v8MR3XABAqtoal9HOsoo",
        "_score" : 0.6931472,
        "_source" : {
          "name" : "john"
        }
      }
    ]
  },
  "aggregations" : {
    "name_faucet" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "john",
          "doc_count" : 1
        }
      ]
    },
    "name_global_faucet" : {
      "doc_count" : 2,
      "first_name" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : "doe",
            "doc_count" : 1
          },
          {
            "key" : "john",
            "doc_count" : 1
          }
        ]
      }
    }
  }
}

关于elasticsearch - 使用Elastic Search的自定义构面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60688229/

10-12 17:37