list - 如何仅获取与 Elasticsearch 列表中匹配的元素值?

标签 list sorting elasticsearch get kibana

[嗨,您好]

我想创建一个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"
       }

首先,我只想获取列表中匹配的元素值。

我只想查看列表中排名为1的文档。但是,如果我按以下方式使用match查询,则结果与kitana 中的 *搜索查询相同。

*匹配查询在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"
       }

这可能吗?

其次,我想按等级对docList进行排序。我尝试通过创建如下查询来进行排序,但未对其进行排序。

*排序查询在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"
   }

我不知道如何访问列表。这两个问题都有好主意吗?

最佳答案

  • 通常,您可以使用source filter来仅检索文档的一部分,但是这种方式无法根据其值排除某些字段。
  • 据我所知,Elasticsearch不支持更改_source中字段值的顺序。通过使用nested字段以及inner_hits -> sort查询表达式,可以部分实现所需的结果。这样排序后的子匹配将在响应的inner_hits部分中返回。

  • 附言通常,在使用Elasticsearch时,应将索引文档视为最小的不可分割搜索单位。

    关于list - 如何仅获取与 Elasticsearch 列表中匹配的元素值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53971662/

    相关文章:

    java - 如何按创建日期对 File.listFiles() 的结果进行排序?

    elasticsearch - Grok解析日志文件中的随机收件人数

    elasticsearch - 如何通过多个字段进行 Elasticsearch 聚合

    elasticsearch - Java-Elasticsearch:根据距离排序

    c - 如何在 vector 中保存结构并用C语言打印出这些值?

    java - 如何在Android中使用Retrofit在recyclerView中设置数据

    mysql - 查找具有相同商品编号的每组行的最低价格条目的详细信息

    C++排序数组函数

    python - 将一个字典的元素与另一字典中的值范围进行比较

    list - 更新 List 的最后一个元素