弹性必须匹配多个字段

发布于 2025-02-07 00:59:34 字数 2223 浏览 0 评论 0原文

我想获取必须包含 idfield &的文档。 名称值,&必须使用 datefield 使用排序

输入的日期范围过滤器:

idfield:多个值, namefield:相同的值, datefield:相同的日期范围,

实际格式:

datefield idfield namefield msgfield

实际语句:

2020-01-01 10:20:10 304 xyz msg1
2020-01-01 10:20:10 102 xyz msg2
2020-01-01 10:20:10 101 pqr msg3
......
2020-01-01 10:21:10 304 xyz msg4
2020-01-01 10:21:10 102 xyz msg5
......

当前查询在下面给出

查询:

{
  "from": 0,
  "size": 2000,
  "sort": [
    {
      "datefield": {
        "order": "asc"
      }
    },
    {
      "idfield.keyword": {
        "order": "asc"
      }
    }
  ], 
   "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "match": {
                  "idfield": "304"
                }
              },
              {
                "match": {
                  "namefield": "xyz"
                }
              },
              {
                "range": {
                  "datefield": {
                    "gte":"2020-01-01T10:20:10",
                    "lte":"2020-01-01T10:30:20"
                  }
                }
              }
            ]
          } 
        },
        {
          "bool": {
            "must": [
              {
                "match": {
                  "idfield": "102"
                }
              },
              {
                "match": {
                  "namefield": "xyz"
                }
              },
              {
                "range": {
                  "datefield": {
                    "gte":"2020-01-01T10:20:10",
                    "lte":"2020-01-01T10:30:20"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

简称,(IDFIELD和NAMEFIELD和DATEFIELD范围)或(IDFIELD和NAMEFIELD和DATEFIELD范围)或等。

例如,(304和XYZ和(2020-01-01 10:20:20:20:20:10&GT) ; =,< = 2020-01-01 10:30:20))或(102 and xyz和(2020-01-01 10:20:10:10> =,< = 2020-01-01 10:30 :20))或等。

如何最小化/改进此查询

I want to fetch documents that must contains given idfield & namefield values, & must apply a date range filter with datefield with sorting

Inputs:

idfield: Multiple values,
namefield: Same value,
datefield: Same date range,

Actual format:

datefield idfield namefield msgfield

Actual statements:

2020-01-01 10:20:10 304 xyz msg1
2020-01-01 10:20:10 102 xyz msg2
2020-01-01 10:20:10 101 pqr msg3
......
2020-01-01 10:21:10 304 xyz msg4
2020-01-01 10:21:10 102 xyz msg5
......

The current query is given below

Query:

{
  "from": 0,
  "size": 2000,
  "sort": [
    {
      "datefield": {
        "order": "asc"
      }
    },
    {
      "idfield.keyword": {
        "order": "asc"
      }
    }
  ], 
   "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "match": {
                  "idfield": "304"
                }
              },
              {
                "match": {
                  "namefield": "xyz"
                }
              },
              {
                "range": {
                  "datefield": {
                    "gte":"2020-01-01T10:20:10",
                    "lte":"2020-01-01T10:30:20"
                  }
                }
              }
            ]
          } 
        },
        {
          "bool": {
            "must": [
              {
                "match": {
                  "idfield": "102"
                }
              },
              {
                "match": {
                  "namefield": "xyz"
                }
              },
              {
                "range": {
                  "datefield": {
                    "gte":"2020-01-01T10:20:10",
                    "lte":"2020-01-01T10:30:20"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

In short, (idfield AND namefield AND datefield range) OR (idfield AND namefield AND datefield range) OR etc.

Ex, (304 AND xyz AND (2020-01-01 10:20:10 >=, <= 2020-01-01 10:30:20)) OR (102 AND xyz AND (2020-01-01 10:20:10 >=, <= 2020-01-01 10:30:20)) OR etc..

How to minimize/improve this query

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

铁憨憨 2025-02-14 00:59:35

您可以使用术语查询它返回在提供字段中包含一个或多个确切条款的文档。以下查询将与您当前查询相同。

{
  "sort": [
    {
      "datefield": {
        "order": "asc"
      }
    },
    {
      "idfield.keyword": {
        "order": "asc"
      }
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "idfield": [
              "304",
              "102"
            ]
          }
        },
        {
          "terms": {
            "namefield": [
              "xyz"
            ]
          }
        },
        {
          "range": {
            "datefield": {
              "gte": "2020-01-01T10:20:10",
              "lte": "2020-01-01T10:30:20"
            }
          }
        }
      ]
    }
  }
}

You can use terms query as it returns documents that contain one or more exact terms in a provided field. Below query will work same as your current query.

{
  "sort": [
    {
      "datefield": {
        "order": "asc"
      }
    },
    {
      "idfield.keyword": {
        "order": "asc"
      }
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "idfield": [
              "304",
              "102"
            ]
          }
        },
        {
          "terms": {
            "namefield": [
              "xyz"
            ]
          }
        },
        {
          "range": {
            "datefield": {
              "gte": "2020-01-01T10:20:10",
              "lte": "2020-01-01T10:30:20"
            }
          }
        }
      ]
    }
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文