ElasticSearch:如何过滤和改变一个数组字段的索引到一个布尔字段?

p5fdfcr1  于 2023-04-05  发布在  ElasticSearch
关注(0)|答案(1)|浏览(102)

ElasticSearch 8.6
下面是我的索引:
第1个示例

_source" : {
          "fieldA" : "M",
          "fieldB" : "SHOWER PACK",
          "fieldC" : "false",
          "fieldD" : "01",
          "fieldE" : "true",
          "fieldArrayA" : [ "val1","val2", "val3"]
}

我想查询我的索引并得到类似于

IF fieldArrayA.length > 0 and val1 in fieldArrayA, THEN true ELSE false

因此,我想知道是否可以请求我的索引以获得以下结果:

_source" : {
          "fieldA" : "M",
          "fieldB" : "SHOWER PACK",
          "fieldC" : "false",
          "fieldD" : "01",
          "fieldE" : "true",
          "fieldArrayA_as_boolean" : true
}

什么是ElasticSearch查询?
第2个示例:

POST tly-idx_test1/_doc
{
  "fieldA": "M",
  "fieldB": "SHOWER PACK",
  "fieldC": "false",
  "fieldD": "01",
  "fieldE": "true",
  "fieldArrayA": [
    "val1",
    "val2",
    "val3"
  ],
   "fieldArrayB": [
    {"fieldB1":"val1"},
    {"fieldB1":"val2"},
    {"fieldB1":"val3"}
  ]
}

Map如下:

PUT tly-idx_test1
{
  "mappings": {
    "properties": {
      "fieldA": {
        "type": "text"
      },
      "fieldArrayA": {
        "type": "keyword"
      },
     "fieldArrayB": {
      "type": "nested",
      "properties": {
        "fieldB1": {
          "type": "keyword",
          "fields": {
            "text": {
              "type": "text",
              "analyzer": "standard"
              }
            }
          }
        }
     },
      "fieldB": {
        "type": "text"
      },
      "fieldC": {
        "type": "text"
      },
      "fieldD": {
        "type": "text"
      },
      "fieldE": {
        "type": "boolean"
      }
    }
  }
}

如何获得以下结果

IF fieldArrayB.length > 0 and val1 in fieldArrayB, THEN true ELSE false

_source" : {
              "fieldA" : "M",
              "fieldB" : "SHOWER PACK",
              "fieldC" : "false",
              "fieldD" : "01",
              "fieldE" : "true",
              "fieldArrayB_as_boolean" : true
    }

谢谢

gwbalxhn

gwbalxhn1#

您可以尝试使用脚本字段。
你想要的只能通过脚本使用Elasticsearch。然而,不建议使用脚本,因为它们不具有性能。另一种选择是使用Terms Query进行查询,但你没有你想要的字段“fieldArrayA_as_boolean”。
您仍然可以接收术语查询的结果,并在您的应用程序中创建一个逻辑,以便在您的答案中添加此字段,从长远来看,这将是更好的想法。
索引:

PUT idx_test
{
  "mappings": {
    "properties": {
      "fieldA": {
        "type": "text"
      },
      "fieldArrayA": {
        "type": "keyword"
      },
      "fieldB": {
        "type": "text"
      },
      "fieldC": {
        "type": "text"
      },
      "fieldD": {
        "type": "text"
      },
      "fieldE": {
        "type": "boolean"
      }
    }
  }
}

POST idx_test/_doc
{
  "fieldA": "M",
  "fieldB": "SHOWER PACK",
  "fieldC": "false",
  "fieldD": "01",
  "fieldE": "true",
  "fieldArrayA": [
    "val1",
    "val2",
    "val3"
  ]
}

质询:

{
  "size": 10,
  "_source": "*",
  "script_fields": {
    "fieldArrayA_as_boolean": {
      "script": {
        "source": """
              def list = doc['fieldArrayA'];
              return list.size() > 0 && list.contains('val1');
              """
      }
    }
  },
  "query": {
    "bool": {
      "filter": [
        {
          "script": {
            "script": {
              "source": """
              def list = doc['fieldArrayA'];
              return list.size() > 0 && list.contains('val1');
              """
            }
          }
        }
      ]
    }
  }
}

Terms Query示例

{
  "size": 10,
  "query": {
    "terms": {
      "fieldArrayA.keyword": [
        "val1"
      ]
    }
  }
}

相关问题