0

私はElasticsearchを理解したと思っていましたが、何かを理解できなかったと思われるため、この問題が発生しました:

膨大な数のフィールドを持つ製品のインデックスを作成していますが、問題の製品は次のとおりです。

{
  "show_in_catalogue": {
    "type": "boolean",
    "index": "no"
  },
  "prices": {
    "type": "object",
    "dynamic": false,
    "properties": {
      "site_id": {
        "type": "integer",
        "index": "no"
      },
      "currency": {
        "type": "string",
        "index": "not_analyzed"
      },
      "value": {
        "type": "float"
      },
      "gross_tax": {
        "type": "integer",
        "index": "no"
      }
    }
  }
}

「show_in_catalogue」が true で、site_id 1 の価格があるすべてのドキュメントを返そうとしています:

{
  "filter": {
    "term": {
      "prices.site_id": "1",
      "show_in_catalogue": true
    }
  },
  "query": {
    "match_all": {}
  }
}

これはゼロの結果を返します。また、「and」フィルターを 2 つの個別の用語で試してみましたが、うまくいきませんでした。

フィルターがない場合に返されるドキュメントのサブセットは次のようになります。

{
  "prices": [
    {
      "site_id": 1,
      "currency": "GBP",
      "value": 595,
      "gross_tax": 1
    },
    {
      "site_id": 2,
      "currency": "USD",
      "value": 745,
      "gross_tax": 0
    }
  ]
}

ここでドキュメントの多くを省略してもよろしいかと思います。私はそれが偶発的であるとは信じていませんが、もちろん確信は持てません。

重要な知識を見逃したのでしょうか、それとも末期的なことをしてしまったのでしょうか? いずれにせよ、この時点で専門家の知識に感謝します。ありがとう!

編集

JT の提案で、ドキュメントのインデックスを再作成して、インデックスが作成されるようにしましたprices.site_idが、変更はありませんでした。また、以下の bool/must フィルターを試してみましたが、役に立ちませんでした。

明確にするために、空のクエリを使用している理由は、Web インターフェイスがクエリ文字列を提供する可能性があるためですが、同じコードを使用してすべての製品を単純にフィルタリングするためです。したがって、クエリを残しましたが、空です。これは、エラスティカがクエリ文字列なしで生成するように見えるためです。

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "show_in_catalogue": true
              }
            },
            {
              "term": {
                "prices.site_id": 1
              }
            }
          ]
        }
      }
    }
  }
}
4

1 に答える 1