假设我要按第10到20个百分点内的某个字段过滤文档。我想知道是否可以通过一些简单的查询(例如)进行查询{"fieldName":{"percentile": [0.1, 0.2]}}
。
说我有这些文件:
[{"a":1,"b":101},{"a":2,"b":102},{"a":3,"b":103}, ..., {"a":100,"b":200}]
我需要按a
(升序)a
从前10位到第10位进行过滤b
,然后按降序对结果进行排序,然后进行分页(如第2页,第10页)每页的项目)。
想到的一种解决方案是:
获取文件总数。
将文档按排序a
,取对应_id
的限制0.1 * total_count
写最终查询,像 id in (...) order by b
但是缺点也很明显:
如果我们谈论的是亚秒级延迟,则似乎效率不高
如果我们_id
在第一个查询中返回的次数太多(第二个查询默认情况下,ES仅允许1000个,则第二个查询可能不起作用。我当然可以更改配置,但总会有一个限制)。
我怀疑如果a
事先不知道的确切值,是否可以在一个查询中执行此操作,尽管我认为一种非常有效的方法是可行的。
我建议做一个percentiles
聚合作为第一查询和第二range
查询。
在我的样本索引中,我只有14个文档,因此出于说明性原因,我将尝试查找那些占字段30%到60%的文档,a
并按b
相反的顺序对它们进行排序(以确保排序有效)。
这是我插入的文档:
{"a":1,"b":101}
{"a":5,"b":105}
{"a":10,"b":110}
{"a":2,"b":102}
{"a":6,"b":106}
{"a":7,"b":107}
{"a":9,"b":109}
{"a":4,"b":104}
{"a":8,"b":108}
{"a":12,"b":256}
{"a":13,"b":230}
{"a":14,"b":215}
{"a":3,"b":103}
{"a":11,"b":205}
让我们找出a
介于30%和60%百分位数之间的字段边界:
POST my_percent/doc/_search
{
"size": 0,
"aggs" : {
"percentiles" : {
"percentiles" : {
"field" : "a",
"percents": [ 30, 60, 90 ]
}
}
}
}
用我的样本索引看起来像这样:
{
...
"hits": {
"total": 14,
"max_score": 0,
"hits": []
},
"aggregations": {
"percentiles": {
"values": {
"30.0": 4.9,
"60.0": 8.8,
"90.0": 12.700000000000001
}
}
}
}
现在我们可以使用边界进行range
查询:
POST my_percent/doc/_search
{
"query": {
"range": {
"a" : {
"gte" : 4.9,
"lte" : 8.8
}
}
},
"sort": {
"b": "desc"
}
}
结果是:
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 4,
"max_score": null,
"hits": [
{
"_index": "my_percent",
"_type": "doc",
"_id": "vkFvYGMB_zM1P5OLcYkS",
"_score": null,
"_source": {
"a": 8,
"b": 108
},
"sort": [
108
]
},
{
"_index": "my_percent",
"_type": "doc",
"_id": "vUFvYGMB_zM1P5OLWYkM",
"_score": null,
"_source": {
"a": 7,
"b": 107
},
"sort": [
107
]
},
{
"_index": "my_percent",
"_type": "doc",
"_id": "vEFvYGMB_zM1P5OLRok1",
"_score": null,
"_source": {
"a": 6,
"b": 106
},
"sort": [
106
]
},
{
"_index": "my_percent",
"_type": "doc",
"_id": "u0FvYGMB_zM1P5OLJImy",
"_score": null,
"_source": {
"a": 5,
"b": 105
},
"sort": [
105
]
}
]
}
}
注意percentiles
聚合的结果是近似的。
通常,这看起来像是通过熊猫或Spark作业可以更好地解决的任务。
希望有帮助!
问题内容: 我正在使用Elasticsearch 1.7.3累积用于分析报告的数据。 我有一个包含文档的索引,其中每个文档都有一个名为“ duration”的数字字段(请求花费了几毫秒)和一个名为“ component”的字符串字段。可能有许多具有相同组件名称的文档。 例如。 我想生成一份报告,说明每个组件: 此组件的所有“持续时间”字段的总和。 此总和在 所有 文档的总期限中所占的百分比。在我的
问题内容: 我有一些文件: 如何按地区过滤/选择不同的文档? 在SQL中,我可以使用GROUP BY。我尝试了条件聚合,但返回的计数却不同。 感谢您的帮助!:-) 问题答案: 如果您的ElasticSearch版本为1.3或更高版本,则可以使用top_hits类型的子聚合,默认情况下,它将为您提供按查询分数排序的前三个匹配文档(此处为1,因为您使用match_all查询)。 您可以将参数设置为3以
问题内容: 我从这样的数据库中提取了数据(为简单起见,将其简化),我想添加一个称为“百分比”的列。 先感谢您 问题答案: 内部选择得到s的和。
我想按给定百分比更新我的实体中的所有价格。我的代码: 我的查询看起来像这样: 这给了我以下错误: [29,30]UPDATE子句有'price'和'=price*:percent',它们之间没有逗号分隔。 [28,28]必须指定等号。 [30,30]算术因子后面必须跟一个表达式。 [30,30]缺少状态字段路径表达式。 [32,37]左表达式不是算术表达式。
我有一个简单的需求,不确定配置solr是否容易做到这一点。 假设所有文档只有一个文本字段,没有标记化。 当查询进来时,我希望结果按匹配文本的百分比排序(包含)。百分比由计算 例如,有三个文档,文本字段如下: doc1:abcdefghij doc2:abcdefgh 3:abc 如果搜索词为“cde”,则文档1和文档2匹配(文本字段包含搜索词)。对于文件1,匹配百分比=3/10=30% 对于文件2
我想把线切成百分比。例如: -我的测试计划 -注册线程(此任务应为) -登录线程(此任务应为@) -搜索线程(此任务应为0) -添加新主题(此任务应为) 我怎么做这个分区? 谢谢