簡體   English   中英

在elasticsearch查詢中從數組中返回前n個元素

[英]Return first n element from array in elasticsearch query

我在名為 IP 的文檔中有一個數組字段,其中包含 10000 ips 以上的元素。

例如

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

現在我用一些過濾器進行了搜索查詢,我得到了結果,但問題是由於上述字段,結果的大小非常大。

現在我只想從數組中獲取 N ips 假設只有 10 個訂單無關緊要。

那我該怎么做...

更新:

除了 IP 字段,還有其他字段,我在該字段上應用了過濾器,而不是在 IP 上。我想要滿足過濾器的整個文檔。我只想限制單個 IP 字段中的元素數量。(如果有,請告訴我除了使用腳本之外的其他方式)。

這種請求可以解決您的問題:

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;
        """
      }
    }
  
  }
}

默認情況下,ES 只返回 10 個匹配的結果,所以我不確定您的搜索查詢是什么以及您到底想限制什么

  1. 單個 ip 字段中的元素數
  2. 與您的搜索結果匹配的 ip 字段數

請在上面澄清並提供您的搜索查詢以提供進一步幫助。

您可以使用scriptedFields從 Elastic Search 中的現有字段生成新字段。 作為評論添加的詳細信息。

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.
      }
    }
  }
}

筆記:

  1. 如果您刪除 _source,則只有腳本字段將是結果的一部分。
  2. 除了訪問字段的值外,其余的語法都是 Java。 改變它適合你。
  3. 除了未分析的文本字段外,還可以使用 doc['fieldName'] 訪問腳本內的字段。 它更快。 請參閱以下 ES 文檔摘錄:

到目前為止,從腳本訪問字段值最快最有效的方法是使用 doc['field_name'] 語法,它從 doc 值中檢索字段值。 Doc 值是一個列式字段值存儲,默認情況下在所有字段上啟用,分析的文本字段除外

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM