使用弹性搜索的自定义方面

问题描述 投票:0回答:1

我有一个使用构面的搜索页面。当用户在搜索栏中输入字词或选中左侧列上的构面复选框时,这会触发我们的弹性搜索索引中的新搜索。enter image description here

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

enter image description here

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

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

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

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

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

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

        for (String colName : colNames) {
        sourceBuilder.aggregation(AggregationBuilders.terms(colName)
                .field(colName + ".keyword"));
    }
elasticsearch aggregation facet elasticsearch-aggregation faceted-search
1个回答
0
投票

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

您可以使用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
          }
        ]
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.