簡體   English   中英

如何查找一個字段的值與另一個字段的值匹配的所有文檔

[英]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來實現此目的,但有一些警告:

  1. Lucene表達式適用於數字類型。 特別是,它將一切視為double

    • 這意味着它目前無法使用string s。
  2. 您必須手動指定"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.

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