我有一堆檔案,在我的索引中是這樣的:
我有一堆檔案,在我的索引中是這樣的:
{}。
"given_name":"John",
"family_name":"Smith",
"email_addresses": []。
{
"email_address":"[email protected]",
"primary":true。
},
{>
"email_address":"[email protected]",
"primary":false。
},
{>
"email_address":"[email protected]",
"primary":false。
},
{>
"email_address":"[email protected]",
"primary":false。
}
]
}
映射看起來是這樣的:
{
"mappings":{
"屬性":{
"given_name":{
"type":"keyword",
"field":{
"搜索":{
"type":"search_as_you_type"
}
}
},
"family_name":{
"type":"keyword",
"field":{
"搜索":{
"type":"search_as_you_type"
}
}
},
"email_addresses":{
"type":"nested",
"屬性":{
"email_address":{
"type":"keyword",
"field":{
"搜索":{
"type":"search_as_you_type"
}
}
},
"primary":{
"type":"boolean"。
}
}
}
}
}
}
我正在對given_name, family_name和email_addresses進行前綴搜索。這將允許用戶開始鍵入,這些欄位的相關結果應該開始回傳:
{}。
"query":{
"bool":{
"should":[]。
{>
"嵌套":{
"path":"email_addresses",
"query":{}。
"prefix":{
"email_addresses.email_address.search": {
"value":"j"
}
}
}
}
},
{>
"multi_match":{
"query":"j",
"fields":[/span>
"given_name.search",
"family_name.search"
],
"type": "bool_prefix"
}
}
]
}
}
}
我想對上述結果進行排序,如果在email_addresses下有一個或多個匹配的email_address,則使用email_addresses下的email_address,其中primary為true。
我已經研究了一個用于排序的腳本,但我沒有在檔案中找到任何方法來訪問腳本中匹配的嵌套子。
是否有辦法實作這個目標?
uj5u.com熱心網友回復:
要做到這一點,我們可以在嵌套排序中使用一個bool查詢。
鑒于我們有以下4個檔案:
{}。
"given_name":"John",
"family_name":"Smith1",
"email_addresses": []。
{
"email_address":"[email protected]",
"primary":true。
},
{>
"email_address":"[email protected]",
"primary":false。
},
{>
"email_address":"[email protected]",
"primary":false。
},
{>
"email_address":"someguy53gmail.com",/span>
"primary":false。
}
]
}
{
"given_name":"John",
"family_name":"Smith2",
"email_addresses": []。
{
"email_address":"[email protected]",
"primary":true。
},
{>
"email_address":"[email protected]",
"primary":false。
},
{>
"email_address":"[email protected]",
"primary":false。
},
{>
"email_address":"someguy56gmail.com",
"primary":false。
}
]
}
{
"given_name":"John",
"family_name":"Smith3",
"email_addresses": []。
{
"email_address":"[email protected]",
"primary":true。
},
{>
"email_address":"[email protected]",
"primary":false。
},
{>
"email_address":"[email protected]",
"primary":false。
},
{>
"email_address":"someguy46gmail.com",
"primary":false。
}
]
}
{
"given_name":"John",
"family_name":"Smith4",
"email_addresses": []。
{
"email_address":"[email protected]",
"primary":true。
},
{>
"email_address":"[email protected]",
"primary":false。
},
{>
"email_address":"[email protected]",
"primary":false。
},
{>
"email_address":"someguy42gmail.com",
"primary":false。
}
]
}
我們可以這樣寫查詢:
{
"query":{
"bool":{
"should":[]。
{>
"嵌套":{
"path":"email_addresses",
"query":{}。
"prefix":{
"email_addresses.email_address.search":{
"value":"john"。
}
}
}
}
},
{>
"multi_match":{
"query":"john",
"fields":[/span>
"given_name.search",
"family_name.search"
],
"type":"bool_prefix"。
}
}
]
}
},
"sort":[/span>
{>
"email_addresses.email_address":{
"order" : "asc",
"嵌套":{
"path":"email_addresses",
"過濾器":{
"bool":{
"should":[]。
{>
"prefix":{
"email_addresses.email_address.search":{
"value":"john"。
}
}
},
{>
"term":{
"email_addresses.primary": true
}
}
]
}
}
}
}
}
]
}
首先我們對email_addresses.email_address、given_name和family_name進行前綴搜索。
然后我們對嵌套的email_addresses欄位進行排序,如下:
- 按
email_addresses欄位排序。 - 按符合我們查詢的
email_addresses.email_address進行排序。 - 按
email_address.primary = true排序。
這種作業方式是,在bool查詢中,Elasticsearch將首先找到符合第一個查詢的should的檔案,并對這些檔案進行排序。對于剩下的不匹配的檔案,它將繼續進行下一個查詢,在我們的例子中是email_address.primary = true。如果有更多的檔案不匹配這些查詢,它們將使用Elasticsearch預先確定的順序進行排序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/328376.html
標籤:
上一篇:如何將一個記錄陣列排序為降序
下一篇:按順序排列影像
