簡體   English   中英

Elasticsearch 5.4:在同一無痛腳本查詢中使用普通字段和嵌套字段?

[英]Elasticsearch 5.4: Use normal and nested fields in same Painless script query?

我有一個這樣的映射:

{
  printings: { 
    type: "nested",
    properties: {
      prop1: {type: "number"}
    }  
  },
  prop2: {type: "number"}
}

然后,我想構建像這樣的無痛查詢:

"script": {
          "lang": "painless",
          "inline": "doc['prop1'] > (3 * doc['printings.prop2'])"
        }

但是,在Sense中進行測試無法正常工作。 如果我用一個簡單的數字替換嵌套的prop2,那么它確實起作用。 有沒有辦法在單個腳本查詢中訪問根道具和嵌套道具?

您可以嘗試下面的查詢。

{
"query": {
  "script": {
     "script": {
        "lang": "painless",
        "inline": "params['_source']['prop1'] > (2 * params['_source']['printings']['prop2'])"
     }
   }
 }
}

但是請記住, _source非常慢。 在這里閱讀更多信息

不幸的是,您不能從根訪問嵌套上下文,也不能從嵌套訪問根上下文,因為嵌套文檔是獨立的文檔,即使它們存儲在父文檔附近。 但是您可以使用copy_to字段功能使用其他映射來解決它。 這是一個映射:

{
    "mappings": {
        "sample": {
            "properties": {
                "printings": {
                    "type": "nested",
                    "properties": {
                        "prop2": {
                            "type": "integer",
                            "copy_to": "child_prop2"
                        }
                    }
                },
                "prop1": {
                    "type": "integer"
                },
                "child_prop2": {
                    "type": "integer"
                }
            }
        }
    }
}

在這種情況下,嵌套文檔中的值將被復制到父級。 您不必顯式填充此新字段,這是批量索引的一個示例:

POST http://localhost:9200/_bulk HTTP/1.1

{"index":{"_index":"my_index","_type":"sample","_id":null}}
{"printings":[{"prop2":1},{"prop2":4}],"prop1":2}
{"index":{"_index":"my_index","_type":"sample","_id":null}}
{"printings":[{"prop2":0},{"prop2":1}],"prop1":2}
{"index":{"_index":"my_index","_type":"sample","_id":null}}
{"printings":[{"prop2":1},{"prop2":0}],"prop1":2}

之后,您可以使用此查詢

{
    "query": {
        "script": {
            "script": {
                "inline": "doc['prop1'].value > (3 * doc['child_prop2'].value)",
                "lang": "painless"
            }
        }
    }
}

第一個文檔不匹配。 第二個將與第一個子文檔匹配。 第三個將與第二個子文檔匹配。

暫無
暫無

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

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