[英]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.