当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch按分页顺序搜索不同的记录

从智志
2023-03-14

如何在按分页顺序聚合术语字段后获取记录。到目前为止,我有这个:

{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "user_id.keyword": [
              "user@domain.com"
            ]
          }
        },
        {
          "range": {
            "creation_time": {
              "gte": "2019-02-04T19:00:00.000Z",
              "lte": "2019-05-04T19:00:00.000Z"
            }
          }
        }
      ],
      "should": [
        {
          "wildcard": {
            "operation": "*sol*"
          }
        },
        {
          "wildcard": {
            "object_id": "*sol*"
          }
        },
        {
          "wildcard": {
            "user_id": "*sol*"
          }
        },
        {
          "wildcard": {
            "user_type": "*sol*"
          }
        },
        {
          "wildcard": {
            "client_ip": "*sol*"
          }
        },
        {
          "wildcard": {
            "country": "*sol*"
          }
        },
        {
          "wildcard": {
            "workload": "*sol*"
          }
        }
      ]
    }
  },
  "aggs": {
    "user_ids": {
      "terms": {
        "field": "country.keyword",
        "include": ".*United.*"
      }
    }
  },
  "from": 0,
  "size": 10,
  "sort": [
    {
      "creation_time": {
        "order": "desc"
      }
    }
  ]
}

我对此进行了研究,有人说,通过使用复合聚合或分区,这是可能的。但我不知道我如何才能真正做到这一点。

我也查看了bucket\u sort,但我似乎无法使其发挥作用:

"my_bucket_sort": {
      "bucket_sort": {
        "sort": [
          {
            "user_ids": {
              "order": "desc"
            }
          }
        ],
        "size": 3
      }
    }

我对这件事很在行。请帮帮我。谢谢

共有1个答案

赵正雅
2023-03-14

由于字段是country,并且可能基数不高,因此可以将大小设置为足够大的数字,以便在一个请求中返回所有国家/地区

  "aggs": {
    "user_ids": {
      "terms": {
        "field": "country.keyword",
        "include": ".*United.*",
        "size": 10000
      }
    }
  }

或者,对于基数较高的字段,可以先过滤聚合,然后使用分区分页遍历值

{
  "size": 0,
  "aggs": {
    "user_ids": {
      "filter": {
        "wildcard" : { "country" : ".*United.*" }
      },
      "aggs": {
        "countries": {
          "terms": {
            "field": "country.keyword",
            "include": {
              "partition": 0,
              "num_partitions": 20
            },
            "size": 10000
          }
        }
      }
    }
  }
}

其中,您将在每次发送最多19个查询时增加分区的值

有关更多详细信息,请参阅elastic文档

 类似资料:
  • 查询:{“explain”:true,“size”:500,“Query”:{“query_string”:{“query_string”:{“query_string”:“((names.name:(BANK AMERICA\\)”)^50或(names.name:(BANK AMERICA\))^30或(name_pair:\“BANK AMERICA\\\)^30或(name_name:(B

  • 我这里的问题是,获取promise在当前文本之前创建了几个字符,然后在最后创建的promise之后解析。我需要解决的最后一个promise的最新或取消以前的promise时,我改变了文本。 我希望结果总是最新的。 我查找了一些搜索栏示例,但什么也没找到。 我很确定解决方案是保存以前的promise,如果在你创建一个新promise时它仍然悬而未决,就取消它,但是我不知道如何取消promise。 谢

  • 问题内容: 在此问题中, 有一个功能要求,要求使用可选种子进行订购,以允许随机订购。 我需要能够对随机排序的结果进行分页。用Elasticsearch 0.19.1怎么做? 谢谢。 问题答案: 您可以使用唯一字段(例如id)和随机盐的哈希函数进行排序。根据结果​​的真实程度,您可以执行以下原始操作: 或像 第二个示例将产生更多随机结果,但速度会稍慢。 为了使这种方法起作用,必须存储字段。否则,查询

  • 问题内容: 考虑: 查询将是这样的: 如何实现按孩子计数? 换句话说,返回的TParent列表的顺序将由TChildSet计数决定。 我知道@Formula可以在SQL环境中使用。我不确定Lucene是否可以使用类似的东西? 任何帮助,指点,评论甚至批评都欢迎。 非常感谢约翰 问题答案: 在hibernate搜索中,您可以为此创建一个自定义Bridge。 类似于以下内容: 使用自定义桥实现:

  • 问题内容: 我正在发送此请求 我得到正确的结果 但是当我想按单词部分搜索时,例如 我没有得到任何结果: 我究竟做错了什么? 问题答案: 这是因为您的字段可能已由标准分析器(默认设置)进行了分析,并且标题已被标记为三个标记,并且。 为了搜索单词的任何子串,您需要创建一个自定义分析器,该分析器利用ngram令牌过滤器来索引每个令牌的所有子串。 您可以这样创建索引: 然后,您可以重新索引数据。这将使标题

  • 我正在使用ElasticSearch5,找不到以下问题的解决方案:我想在文档中搜索带斜杠的字符串(url的一部分)。但它不会返回匹配的文档。我读过一些东西,带斜线的字符串被ES拆分,这不是我想要的字段。我尝试用映射在字段上设置“not_analysis”,但似乎无法使其工作。 “创建索引”:Put http://localhost:9200/test “添加文档”:post http://loca