es根据字段长度过滤_elasticsearch通过作为数组的字段的⼤
⼩过滤
elasticsearch通过作为数组的字段的⼤⼩过滤
如何过滤具有⼀个数组的字段并且包含N个以上元素的⽂档?
如何过滤具有为空数组的字段的⽂档?
是解决⽅案吗? 如果是这样,怎么办?
eran asked 2020-06-23T22:10:24Z
8个解决⽅案
53 votes
我将看⼀下脚本过滤器。 以下过滤器应仅返回params字段(包含数组)中⾄少包含10个元素的⽂档。 请记住,这可能很昂贵,具体取决于索引中有多少个⽂档。
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.length > 10"
}
}
关于第⼆个问题:那⾥真的有⼀个空数组吗? 还是仅仅是⼀个没有值的数组字段? 您可以使⽤缺少的过滤器来获取对特定字段没有价值的⽂档:
"filter" : {
"missing" : { "field" : "user" }
}
否则,我想您需要再次使⽤脚本,类似于我上⾯建议的脚本,只是输⼊的长度不同。 如果长度是常数,则将其放在params中,以使脚本将被Elasticsearch缓存并重新使⽤,因为它始终是相同的:
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.length > param1"
"params" : {
"param1" : 10
}
}
}
javanna answered 2020-06-23T22:10:42Z
13 votes
javanna的答案在Elasticsearch 1.3.x和更早版本上是正确的,从1.4开始,默认脚本模块已更改为groovy(以前是mvel)。
回答OP的问题。
在Elasticsearch 1.3.x和更早版本上,使⽤以下代码:
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.length > 10"
}
}
在Elasticsearch 1.4.x和更⾼版本上,使⽤以下代码:
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.size() > 10"
}
}
MicroAleX answered 2020-06-23T22:11:19Z
6 votes
恕我直⾔,使⽤脚本按⼤⼩过滤数组的正确⽅法是:
"filter" : {
"script" : {
"script" : "_source.fieldName.size() > 1"
}
}
如果我按照@javanna的建议进⾏操作,则会引发异常groovy.lang.MissingPropertyException: No such property: length for class: java.lang.String
lisak answered 2020-06-23T22:11:44Z
5 votes
仍然张贴到这⾥与谁坚持我的情况相同。假设您的数据如下所⽰:
{
"_source": {
"fieldName" : [
{
"f1": "value 11",
"f2": "value 21"
},
{
"f1": "value 12",
"f2": "value 22"
}
]
}
}
然后以长度> 1来过滤fieldName,例如:
"query": {
"bool" : {
"must" : {
"script" : {
"script" : {
"inline": "doc['fieldName.f1'].values.length > 1",
"lang": "painless"
}
}
}
}
}
ThangTD answered 2020-06-23T22:12:12Z
4 votes
并在lisak的答案上。
有size()函数可返回列表的长度:
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.size() > 10"
}
}
treku answered 2020-06-23T22:12:41Z
3 votes
最简单的⽅法是对数据进⾏“⾮规范化”,以便您拥有⼀个包含计数和布尔值(如果存在或不存在)的属性。 然后,您可以仅搜索这些属性。例如:
{
"id": 31939,
"hasAttachments": true,
"attachmentCount": 2,
"attachments": [
{
"type": "Attachment",
"name": "",
"mimeType": "text/plain"
},
{
"type": "Inline",
"name": "jpg.jpg",
"mimeType": "image/jpeg"
}
]
}
superlogical answered 2020-06-23T22:13:06Z
0 votes
当您需要查包含某些字段的⽂档,该⽂档的⼤⼩/长度应该更⼤时,则零@javanna给出了正确的答案。 如果您的字段是⽂本字段,并且您想查包含该字段中某些⽂本的⽂档,那么我只能添加,您不能使⽤相同的查询。 您将需要执⾏以下操作:
GET index/_search
{
"query": {
"bool": {
"must": [
{
"range": {
filter过滤对象数组"FIELD_NAME": {
"gt": 0
}
}
}
]
}
}
}
这不是对这个问题的确切答案,因为答案已经存在,但是我已经解决了类似问题,所以也许有⼈会觉得它有⽤。Luka Lopusina answered 2020-06-23T22:13:31Z
0 votes
如果您有未映射为doc['attachments.size'].length的对象数组,请记住,Elastic会将其展平为:
attachments: [{size: 123}, {size: 456}] --> attachments.size: [123, 456]
因此,您要将字段引⽤为doc['attachments.size'].length,⽽不是doc['attachments'].length,这⾮常违反直觉。与.values相同。
.values部件已弃⽤,不再需要。
user1306787 answered 2020-06-23T22:14:04Z
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论