elasticsearch_dsl/search/response/
hit.rs

1use super::{Explanation, NestedIdentity, Source};
2use crate::{util::ShouldSkip, InnerHitsResult, Map};
3use serde::de::DeserializeOwned;
4use serde_json::Value;
5
6/// Represents a single matched document
7#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
8pub struct Hit {
9    /// Search explanation
10    #[serde(
11        skip_serializing_if = "ShouldSkip::should_skip",
12        rename = "_explanation"
13    )]
14    pub explanation: Option<Explanation>,
15
16    /// Document index
17    #[serde(
18        default,
19        skip_serializing_if = "ShouldSkip::should_skip",
20        rename = "_index"
21    )]
22    pub index: String,
23
24    /// Document ID
25    #[serde(
26        default,
27        skip_serializing_if = "ShouldSkip::should_skip",
28        rename = "_id"
29    )]
30    pub id: String,
31
32    /// Document score. [`None`] when documents are implicitly sorted by a
33    /// field other than `_score`
34    #[serde(skip_serializing_if = "ShouldSkip::should_skip", rename = "_score")]
35    pub score: Option<f32>,
36
37    /// Nested document identity
38    #[serde(skip_serializing_if = "ShouldSkip::should_skip", rename = "_nested")]
39    pub nested: Option<NestedIdentity>,
40
41    /// Document source
42    #[serde(
43        skip_serializing_if = "ShouldSkip::should_skip",
44        rename = "_source",
45        default
46    )]
47    pub source: Source,
48
49    /// Highlighted matches
50    #[serde(skip_serializing_if = "ShouldSkip::should_skip", default)]
51    pub highlight: Map<String, Vec<String>>,
52
53    /// Inner hits
54    #[serde(skip_serializing_if = "ShouldSkip::should_skip", default)]
55    pub inner_hits: Map<String, InnerHitsResult>,
56
57    /// Matched queries
58    #[serde(skip_serializing_if = "ShouldSkip::should_skip", default)]
59    pub matched_queries: Vec<String>,
60
61    /// Values document was sorted by
62    #[serde(skip_serializing_if = "ShouldSkip::should_skip", default)]
63    pub sort: Vec<Value>,
64
65    /// Field values for the documents. Need to be specified in the request
66    #[serde(skip_serializing_if = "ShouldSkip::should_skip", default)]
67    pub fields: Map<String, Value>,
68}
69
70impl Hit {
71    /// Parses document source into a concrete type
72    pub fn source<T>(&self) -> Result<T, serde_json::Error>
73    where
74        T: DeserializeOwned,
75    {
76        self.source.parse()
77    }
78}