[英]How to find all documents where the value of one field matches that of another
我在文檔中有兩個字段,具有以下映射:
"field_a": {
"type": "float"
},
"field_b": {
"type": "float"
}
我如何才能找到其中的價值的所有文件field_a
匹配的field_b
? 這是否可以禁用腳本?
基本上你需要一個腳本來執行它 - 即使禁用腳本也可以工作,因為lucene表達式是完全沙箱化的:
GET /index/_search
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{
"script": {
"lang": "expression",
"script": "doc['field_a'].value == doc['field_b'].value"
}
}
]
}
}
}
}
}
這是否可以禁用腳本?
這取決於禁用腳本的含義。 如果您使用最新的1.4或1.5版本(目前為1.4.5和1.5.2)上的默認設置運行Elasticsearch,那么您仍然可以使用動態腳本,但它僅限於沙盒語言。
目前,唯一的內置和沙盒選項是Lucene Expressions,它不是默認的腳本語言(Groovy在兩個版本中,但它被認為是未經過安裝的)。
因此,假設您沒有手動禁用動態腳本,那么您仍然可以使用Lucene Expressions來實現此目的,但有一些警告:
Lucene表達式僅適用於數字類型。 特別是,它將一切視為double
。
string
s。 您必須手動指定"expression"
作為腳本語言。
從那里,創建這個腳本非常容易:
GET /my-index/my-type/_search
{
"query" : {
"filtered" : {
"filter" : {
"script" : {
"script" : "doc[field_1].value == doc[field_2].value",
"lang" : "expression",
"params" : {
"field_1" : "field_a",
"field_2" : "field_b"
}
}
}
}
}
}
我用"params"
顯示它,表明你可以為多個字段重用相同的腳本。 此外,您可以通過使用基於文件的腳本來重復使用Groovy 腳本 ,從而避免動態腳本。 從那里,您可以存儲Groovy腳本(例如,“equal_fields.groovy”),如鏈接所示:
doc[field_1]?.value == doc[field_2]?.value
然后,您可以以非常類似的方式重用它:
GET /my-index/my-type/_search
{
"query" : {
"filtered" : {
"filter" : {
"script" : {
"file" : "equal_fields",
"params" : {
"field_1" : "field_a",
"field_2" : "field_b"
}
}
}
}
}
}
注意:長期來說,它應該是"script_file"
而不是"file"
,但它目前在允許腳本的不同API中並不總是干凈的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.