使用Elastic Search的自定义构面

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

使用Elastic Search的自定义构面

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

使用Elastic Search的自定义构面

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

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

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

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

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

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

        for (String colName : colNames) {
        sourceBuilder.aggregation(AggregationBuilders.terms(colName)
                .field(colName + ".keyword"));
    }
wssfeng8287 回答:使用Elastic Search的自定义构面

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

您可以使用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","_id" : "wMMR3XABAqtoal9HU8rs","_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","_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,"buckets" : [
          {
            "key" : "doe","doc_count" : 1
          },{
            "key" : "john","doc_count" : 1
          }
        ]
      }
    }
  }
}
本文链接:https://www.f2er.com/2645374.html

大家都在问