如何在ElasticSearch中仅获取列表中匹配的元素值?

neekobn8  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(401)

[你好]
我想创建一个es查询,只检索列表中匹配的某些元素。
这是我的es索引模式。

"test-es-2018":{
"aliases": {}, 
"mappings": { 
  "test-1": { 
    "properties": { 
      "categoryName": { 
        "type": "keyword", 
        "index": false 
      }, 
      "genDate": { 
        "type": "date" 
      }, 
      "docList": { 
        "properties": { 
          "rank": { 
            "type": "integer", 
            "index": false 
          }, 
          "doc-info": {
            "properties": { 
              "docId": { 
                "type": "keyword" 
              }, 
              "docName": { 
                "type": "keyword", 
                "index": false 
              }, 
            } 
          }
        } 
      }, 
      "categoryId": { 
        "type": "keyword" 
      }, 
    } 
  }
}

}
类别中列出了文档。清单中的文件有自己的信息。

  • 在kibana中搜索查询。
source": { 
        "categoryName" : "food" , 
        "genDate" : 1577981646638, 
        "docList" [
        {
          "rank": 2, 
          "doc-info": {...} 
        },
        {
          "rank": 1, 
          "doc-info": {...} 
        },
        {
          "rank": 5, 
          "doc-info": {...}
        },
       ],
       "categoryId": "201"
       }

首先,我只想得到列表中匹配的元素值。
我只想看到列表中排名第一的文件。但是,如果我使用 match 如下所示,结果与kibana中的*search query相同。

  • 在kibana中匹配查询。
GET test-es-2018/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "docList.rank": 1 } },
      ] 
    }
  }
}

在我看来,它似乎打印了整个列表,因为它包含一个排名第一的文档。
我想要的是:

source": { 
        "categoryName" : "food" , 
        "genDate" : 1577981646638, 
        "docList" [
          {
            "rank": 1, 
            "doc-info": {...} 
          },
       ],
       "categoryId": "201"
       }

这可能吗?
其次,我想按等级对文档列表进行排序。我尝试通过创建一个如下所示的查询来排序,但没有排序。

  • 对kibana中的查询进行排序。
GET test-es-2018/_search? 
{
  "query" : {
    "bool" : {...}
  },
  "sort" : [
    {
      "docList.rank" : {
          "order" : "asc"
      }
    }
  ]
}

我想要的是:

source": { 
    "categoryName" : "food" , 
    "genDate" : 1577981646638, 
    "docList" [
    {
      "rank": 1, 
      "doc-info": {...} 
    },
    {
      "rank": 2, 
      "doc-info": {...} 
    },
    {
      "rank": 5, 
      "doc-info": {...}
    },
   ],
   "categoryId": "201"
   }

我不知道如何进入名单。这两个问题都有好的解决方法吗?

z18hc3ub

z18hc3ub1#

一般来说,您可以使用源过滤器仅检索文档的一部分,但这样就不可能根据某些字段的值排除它们。
据我所知,elasticsearch不支持更改源中字段值的顺序。通过使用 nested 田地和 inner_hits -> sort 查询表达式。这样,排序的子项将在 inner_hits 回复部分。
p、 通常使用elasticsearch时,您应该将索引文档视为最小的不可分割搜索单元。

相关问题