lucene Elasticsearch -匹配所有数组列表字段

uxhixvfz  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(198)

我有几个带有数组“items”的文档,我想只挑选那些“items.name“等于“red”的文档。如果有任何文档带有一种红色和另一种颜色,那么它不应该出现在结果中。
1.

{
  "items": [
    {
      "id": "4",
      "name": "red"
    },
    {
      "id": "5",
      "name": "blue"
    }
  ]
}
{
  "items": [
    {
      "id": "3",
      "name": "red"
    }
  ]
}
{
  "items": [
    {
      "id": "2",
      "name": "red"
    },
    {
      "id": "1",
      "name": "red"
    }
  ]
}

现在,在这里我需要一个查询,其中只有文档2和3应该在结果中,因为“红色”出现在所有“items.name“中。文档1被忽略,因为它也包含蓝色。

pod7payv

pod7payv1#

下面是我使用脚本的第一个解决方案:

GET test/_search
{
  "runtime_mappings": {
    "all_red_items": {
      "type": "boolean",
      "script": {
        "source": "int count = 0; for (int i = 0; i < doc['items.name'].size(); i++) { if (doc['items.name'][i] != 'red') { count++ }} emit(count == 0);"
      }
    }
  },
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "all_red_items": {
              "value": true
            }
          }
        }
      ]
    }
  }
}

下面是我的正则表达式解决方案:

GET test/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "items.name": {
              "value": "red"
            }
          }
        }
      ],
      "must_not": [
        {
          "regexp": {
            "items.name": "@&~(red)"
          }
        }
      ]
    }
  }
}

在发送请求之前,您需要准备以下索引:

DELETE test

PUT test
{
  "mappings": {
    "properties": {
      "items": {
        "properties": {
          "name": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

POST test/_doc
{
  "items": [
    {
      "id": 6,
      "name": "red"
    },
    {
      "id": 5,
      "name": "blue"
    }
  ]
}

POST test/_doc
{
  "items": [
    {
      "id": 1,
      "name": "red"
    }
  ]
}

POST test/_doc
{
  "items": [
    {
      "id": 3,
      "name": "red"
    },
    {
      "id": 4,
      "name": "red"
    }
  ]
}

GET test/_mapping

相关问题