返回elasticsearch查询中数组的第一个n元素

ryevplcw  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(3)|浏览(963)

我在文档中有一个名为ip的数组字段,它包含超过10000个ip作为元素。
例如。

IP:["192.168.a:A","192.168.a:B","192.168.a:C","192.168.A:b"...........]

现在,我做了一个搜索查询与一些过滤器,我得到了结果,但问题是结果的大小非常大,因为上述领域。
现在我只想从数组中获取n个ip,假设只有10个顺序无关紧要。
那我该怎么做。。。
更新:
除了ip字段还有其他字段,我对该字段应用了筛选器而不是ip。我想要满足筛选器的整个文档。我只想限制单个ip字段中的元素数。(如果除了使用脚本还有其他方法,请告诉我)。

o0lyfsai

o0lyfsai1#

可以使用scriptedfields从ElasticSearch中的现有字段生成新字段。作为注解添加的详细信息。

GET indexName/_search
{
  "_source": {
    "excludes": "ips"  //<======= Exclude from source the IP field (change the name based on your document)
  }, 
  "query": {
    "match_all": {} // <========== Define relevant filters
  },
  "script_fields": {
    "limited_ips": { // <========= add a new scipted field
      "script": { 
        "source": "params['_source'].ips.stream().limit(2).collect(Collectors.toList())" // <==== Replace 2 with the number of i.ps you want in result.
      }
    }
  }
}

注:
如果删除\u源,则只有脚本字段将是结果的一部分。
除了访问字段的值之外,其余的语法是java。随你的便变。
除了未分析的文本字段外,使用doc['fieldname']访问脚本中的字段。速度更快。见以下e.s文件摘录:
到目前为止,从脚本访问字段值的最快最有效的方法是使用doc['field\u name']语法,它从doc值中检索字段值。文档值是一个列式字段值存储,默认情况下对除分析文本字段以外的所有字段启用

qzwqbdag

qzwqbdag2#

这种请求可以解决您的问题:

GET ips/_search
{
  "query": {
    "match_all": {}
  },
  "script_fields": {
    "truncate_ip": {
      "script": {
        "source": """
        String[] trunc_ip = new String[10];
        for (int i = 0; i < 10; ++i) {
              trunc_ip[i]= params['_source']['IP'][i];
            }
          return trunc_ip;
        """
      }
    }

  }
}
z18hc3ub

z18hc3ub3#

默认情况下es只返回10个匹配结果,所以我不确定您的搜索查询是什么,以及您到底想要限制什么
单个ip字段中的元素数
与搜索结果匹配的ip字段数
请澄清以上内容,并提供您的搜索查询,以进一步帮助。

相关问题