Elasticsearchクエリの同一配列

2020-07-29 arrays elasticsearch

次のようなドキュメントがあります。

Doc1

{
"id": ...,
...
"articles": [
  {
    "id": "5cdd17c7e24f6e05d487b2c2#142936",
    ...
  },
  {
    "id": "5cdd17c7e24f6e05d487b2c2#226536",
    ...
  }
...
}

Doc2

{
"id": ...,
...
"articles": [
  {
    "id": "5cdd17c7e24f6e05d487b2c2#142936",
    ...
  },
  {
    "id": "5cdd17c7e24f6e05d487b2c2#226536",
    ...
  },
  {
    "id": "5cdd17c7e24f6e05d487b2c2#142965",
    ...
  }
...
}

Doc3

{
"id": ...,
...
"articles": [
  {
    "id": "5cdd17c7e24f6e05d487b2c2#142936",
    ...
  }
...
}

そして、ドキュメントには必要な一連の記事が正確に含まれている必要があります。たとえば、記事のIDの配列が['5cdd17c7e24f6e05d487b2c2#142936'、 '5cdd17c7e24f6e05d487b2c2#226536']の場合、Doc1のみを取得します。

今、私はこのクエリを持っています:

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "articles",
            "query": {
              "query_string": {
                "default_field": "articles.id",
                "query": "5cdd17c7e24f6e05d487b2c2#142936 AND 5cdd17c7e24f6e05d487b2c2#226536"
              }
            }
          }
        }
      ]
    }
  }
}

しかし、これでDoc1とDoc2を取得します...

Answers

articles.idのタイプがkeywordであると仮定すると、これはうまくいくと思います(クエリを記述する最も効率的な方法であるかどうかはわかりません)。

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "articles",
            "query": {
              "term": {
                "articles.id": "5cdd17c7e24f6e05d487b2c2#142936"
              }
            }
          }
        },
        {
          "nested": {
            "path": "articles",
            "query": {
              "term": {
                "articles.id": "5cdd17c7e24f6e05d487b2c2#226536"
              }
            }
          }
        }
      ],
      "must_not": {
        "nested": {
          "path": "articles",
          "query": {
            "query_string": {
              "default_field": "articles.id",
              "query": "NOT 5cdd17c7e24f6e05d487b2c2#142936 AND NOT 5cdd17c7e24f6e05d487b2c2#226536"
            }
          }
        }
      }
    }
  }
}

Related