当前位置: 首页 > 知识库问答 >
问题:

在Elasticsearch中查询已排序的嵌套文档

澹台俊晖
2023-03-14

我是Elasticsearch的新手,如果我问的问题非常简单直接,我会道歉。

我使用以下学生教育细节的映射,

PUT students
{
  "mappings" : {
      "properties" : {
        "StudentName" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "Education" : {
          "type" : "nested",
          "properties" : {
            "degreeName" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "schoolName" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "endDate" : {
              "type" : "date"
            },
            "startDate" : {
              "type" : "date"
            }
          }
        }
      }
  }
}

我的数据集中有近15000名学生。文件示例:

PUT students/_doc/2
{
  "StudentName":"Student 2",
  "Education": [
    {
      "degreeName": "MS",
      "schoolName": "School Y",
      "startDate": "2016-05-01",
      "endDate":"2014-01-01"
    },
    {
      "degreeName": "PhD",
      "schoolName": "School X",
      "startDate": "2019-01-01",
      "endDate":"2017-05-01"
    },
    {
      "degreeName": "BE",
      "schoolName": "School Z",
      "startDate": "2013-05-01",
      "endDate":"2009-01-01"
    }]
}

PUT students/_doc/3
{
  "StudentName":"Student 3",
  "Education": [
    {
      "degreeName": "BE",
      "schoolName": "School P",
      "startDate": "2003-01-01",
      "endDate":"1999-05-01"
    }]
}

我的问题是,我正在尝试做一个简单的查询,以显示那些拥有“BE”学位的学生。但我希望目前拥有BE(工程学士)学位的学生的排名高于同样拥有硕士和博士学位的学生。

从我的例子中,如果我查询“BE”,学生3应该比学生2排名更高。我应该能够根据"endDate"属性按降序排序我的嵌套文档,然后如果"degreeName"与排序嵌套字段的第一个元素中的"BE"匹配,则进行增强。

有人能解释一下吗?我已经通过了嵌套查询,嵌套过滤器。我知道如何使用“内部点击”对嵌套字段中的元素进行排序。但我想知道是否有任何方法可以排序,然后查询,以提供额外的推动。

提前感谢。

共有1个答案

晏富
2023-03-14

最简单的解决方案是在必须子句中加入应该子句,在应该子句中,您只提到让学生有be但没有MS或PhD的逻辑。

所有这些都在您的布尔查询中

请注意,must在隐喻上类似于逻辑,而should则是

一旦完成,您可以简单地添加Sort中的逻辑(如链接中提到的),首先使用_score进行排序,然后根据Education.endDate字段进行排序。

以下是解决方案

POST students/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match" :{
            "StudentName": "student"
          }
        }
      ], 
      "should": [
        {
          "bool": {
            "must": [
              {
                "nested": {
                  "path": "Education",
                  "query": {
                    "terms": {
                      "Education.degreeName.keyword": [
                        "BE"
                      ]
                    }
                  }
                }
              }
            ],
            "must_not": [
              {
                "nested": {
                  "path": "Education",
                  "query": {
                    "terms": {
                      "Education.degreeName.keyword": [
                        "MS",
                        "PhD"
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  },
  "sort": [
    { "_score" : { "order": "desc"}},
    {
      "Education.endDate": {
        "order": "desc"
      }
    }
  ]
}

让我知道这是否有帮助!

 类似资料:
  • 我是elasticsearch的新手,对如何进行过滤器、查询和聚合有一些想法,但不确定如何解决下面的问题。我希望能够从下面显示的文档中只查询公司的最新交付(日期和crate_quantity)。我不确定如何去做。有没有办法使用最大聚合从每个文档中只提取最近的交付?

  • 问题内容: 我在获取与Elasticsearch一起使用的嵌套查询时遇到问题(如果我删除了查询字符串之一,则可以使用)。我要解决的问题是我有一个包含关闭列表的文档(关闭)。我想在条件满足另一个值的闭包列表中搜索一个值。那只是从argan = 1的闭包中获得价值 我正在得到这个错误响应; 我的映射如下所示。 有人知道我在做什么错吗? 问题答案: 您的查询不是有效的查询。您需要使用适当的复合查询将其他

  • 问题内容: 我正在尝试在Elasticsearch中进行嵌套排序,但到目前为止没有成功。 我的数据结构: 我想根据文档中第一作者的姓氏对文档进行排序。 使用的映射: 使用SearchRequestBuilder(JAVA)进行排序: 这行得通,但没有给出想要的结果(例如,首先是“叫卖”,然后是“罗杰”)。 我错过了什么吗?有没有办法表明Elasticsearch访问数组authorList的ind

  • 我试图在Elasticsearch中进行嵌套排序,但到目前为止还没有成功。 我的数据结构: 我想根据文档中第一作者的姓氏对文档进行排序。 使用SearchRequestBuilder(JAVA)进行排序: 这是有效的,但不能给出想要的结果(例如,首先是“霍金”,然后是“罗杰”)。 我是不是漏掉了什么?是否有一种方法可以指示Elasticsearch访问数组authorlist的index=0?是否

  • 我试图创建一个嵌套查询,它将过滤掉一些带有特定术语的文档。在本例中,我试图过滤掉在user.first中有匹配术语的文档。数据示例: 我的查询没有得到所需的结果,因为它返回给我所有未筛选的记录。我尝试使用: 我希望这里得到与过滤器不匹配的文档。在这种情况下,它应该只返回第二个文档。做这件事的正确方法是什么?

  • 问题内容: 我想使用ES进行图书搜索。因此,我决定将作者姓名和标题(作为嵌套文档)放入索引,如下所示: 我不明白的是:如何构造搜索查询,以便在搜索“一二”时仅找到第二本书,而在搜索“二三”时什么也找不到,而在搜索“一”时所有图书呢? 问题答案: 也许是这样的? 该查询基本上说一个文件必须有and 。您可以轻松地重新配置该查询。例如,如果您只想搜索作者,请删除嵌套部分。如果您想要另一本书,请更改嵌套