我是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"匹配,则进行增强。
有人能解释一下吗?我已经通过了嵌套查询,嵌套过滤器。我知道如何使用“内部点击”对嵌套字段中的元素进行排序。但我想知道是否有任何方法可以排序,然后查询,以提供额外的推动。
提前感谢。
最简单的解决方案是在必须
子句中加入应该
子句,在应该
子句中,您只提到让学生有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 。您可以轻松地重新配置该查询。例如,如果您只想搜索作者,请删除嵌套部分。如果您想要另一本书,请更改嵌套