-1

我有一个弹性搜索查询:

{
    "query": {
            "bool": {
                "should": [
                    {'match_phrase': {'unique_chat_session_id': '1a8905a2-b328-4f57-8ce8-7ba2e43e138e'}}, {'match_phrase': {'unique_chat_session_id': 'f6a83c4a-8d2f-4f04-9eff-e753957fe9d2'}}
                ]
            }
        },
        "sort": [{"message_no": {"order": "asc"}}]
}

并以以下格式输出:

    [
  {
    '_index': '',
    '_type': '',
    '_id': 'cPeZLG8BH6c52U24FH95',
    '_score': None,
    '_source': {
      'unique_chat_session_id': '1a8905a2-b328-4f57-8ce8-7ba2e43e138e',
      'message_no': 1
    },
    'sort': [
      1
    ]
  },
  {
    '_index': '',
    '_type': '',
    '_id': 'dPeZLG8BH6c52U24_X8k',
    '_score': None,
    '_source': {
      'unique_chat_session_id': 'f6a83c4a-8d2f-4f04-9eff-e753957fe9d2',
      'message_no': 1
    },
    'sort': [
      1
    ]
  },
  {
    '_index': '',
    '_type': '',
    '_id': 'cfeZLG8BH6c52U24FH_x',
    '_score': None,
    '_source': {
      'unique_chat_session_id': '1a8905a2-b328-4f57-8ce8-7ba2e43e138e',
      'message_no': 2
    },
    'sort': [
      2
    ]
  },
  {
    '_index': '',
    '_type': '',
    '_id': 'dfeZLG8BH6c52U24_X-w',
    '_score': None,
    '_source': {
      'unique_chat_session_id': 'f6a83c4a-8d2f-4f04-9eff-e753957fe9d2',
      'message_no': 2
    },
    'sort': [
      2
    ]
  },
  {
    '_index': '',
    '_type': '',
    '_id': 'cveZLG8BH6c52U24F3-c',
    '_score': None,
    '_source': {
      'unique_chat_session_id': '1a8905a2-b328-4f57-8ce8-7ba2e43e138e',
      'message_no': 3
    },
    'sort': [
      3
    ]
  },
  {
    '_index': '',
    '_type': '',
    '_id': 'c_eZLG8BH6c52U24GH8K',
    '_score': None,
    '_source': {
      'unique_chat_session_id': '1a8905a2-b328-4f57-8ce8-7ba2e43e138e',
      'message_no': 4
    },
    'sort': [
      4
    ]
  }
]

现在我想进行一个查询,其中我将以数组格式传递 unique_chat_session_id 并精确匹配 [1a8905a2-b328-4f57-8ce8-7ba2e43e138e, f6a83c4a-8d2f-4f04-9eff-e753957fe9d2] 我想在与数组相同的方式。它应该显示第一个数组元素(这里是 1a8905a2-b328-4f57-8ce8-7ba2e43e138e)的所有结果,并在 msg_no 上应用了排序。所以我的输出结果应该是:

[
  {
    '_index': '',
    '_type': '',
    '_id': 'cPeZLG8BH6c52U24FH95',
    '_score': None,
    '_source': {
      'unique_chat_session_id': '1a8905a2-b328-4f57-8ce8-7ba2e43e138e',
      'message_no': 1
    },
    'sort': [
      1
    ]
  },
  {
    '_index': '',
    '_type': '',
    '_id': 'cfeZLG8BH6c52U24FH_x',
    '_score': None,
    '_source': {
      'unique_chat_session_id': '1a8905a2-b328-4f57-8ce8-7ba2e43e138e',
      'message_no': 2
    },
    'sort': [
      2
    ]
  },
  {
    '_index': '',
    '_type': '',
    '_id': 'cveZLG8BH6c52U24F3-c',
    '_score': None,
    '_source': {
      'unique_chat_session_id': '1a8905a2-b328-4f57-8ce8-7ba2e43e138e',
      'message_no': 3
    },
    'sort': [
      3
    ]
  },
  {
    '_index': '',
    '_type': '',
    '_id': 'c_eZLG8BH6c52U24GH8K',
    '_score': None,
    '_source': {
      'unique_chat_session_id': '1a8905a2-b328-4f57-8ce8-7ba2e43e138e',
      'message_no': 4
    },
    'sort': [
      4
    ]
  }
  {
    '_index': '',
    '_type': '',
    '_id': 'dPeZLG8BH6c52U24_X8k',
    '_score': None,
    '_source': {
      'unique_chat_session_id': 'f6a83c4a-8d2f-4f04-9eff-e753957fe9d2',
      'message_no': 1
    },
    'sort': [
      1
    ]
  },
  {
    '_index': '',
    '_type': '',
    '_id': 'dfeZLG8BH6c52U24_X-w',
    '_score': None,
    '_source': {
      'unique_chat_session_id': 'f6a83c4a-8d2f-4f04-9eff-e753957fe9d2',
      'message_no': 2
    },
    'sort': [
      2
    ]
  }
]
4

1 回答 1

0

如果我正确理解您的问题,您希望按照请求中提供的顺序取回文件unique_chat_session_id's,然后unique_chat_session_idmessage_no.

由于第一个排序标准不基于存储在索引中的值的任何逻辑顺序,而仅依赖于请求中值的位置,因此无法通过带有sort-clauses 的查询来完成。

您可能需要考虑使用聚合,首先按照您想要的顺序请求各个存储桶,然后,对于每个存储桶,您请求前 n 个命中。

例子:

POST /chat/_search
{
  "size": 0,
  "aggs": {
    "chat_sessions": {
      "filters": {
        "filters": [
          { "term": { "unique_chat_session_id.keyword": "1a8905a2-b328-4f57-8ce8-7ba2e43e138e" }},
          { "term": { "unique_chat_session_id.keyword": "f6a83c4a-8d2f-4f04-9eff-e753957fe9d2" }}
        ]
      },
      "aggs": {
        "messages_per_session": {
          "top_hits": {
            "sort": [
              { "message_no": { "order": "asc" }}
            ],
            "size" : 10
          }
        }
      }
    }
  }
}

过滤后的存储桶将按照请求中提供的顺序返回。但请注意,top_hits聚合并不意味着返回数百或数千个文档,正如其名称所暗示的那样,返回前几个命中是理想的,您可以使用聚合中的size参数进行控制。top_hits

由于您没有提供映射,我假设字符串字段的默认映射,它作为一个多字段unique_chat_session_id映射到一个类型的字段text(非常适合全文搜索,但不确定这对您的使用是否有意义-case)unique_chat_session_id.keyword并被映射到类型的字段keyword(非常适合精确匹配搜索,这是您在示例中需要的。

于 2019-12-23T11:12:08.520 回答