<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### 處理 Null 值 回到我們早期的示例,在文檔中有一個多值的字段 `tags`,一個文檔可能包含一個或多個標簽,或根本沒有標簽。如果一個字段沒有值,它是怎么儲存在倒排索引中的? 這是一個取巧的問題,因為答案是它根本沒有存儲。讓我們從看一下前幾節的倒排索引: | Token | DocIDs | |---------------|--------| |`open_source` | `2` | |`search` | `1`,`2`| 你怎么可能儲存一個在數據結構不存在的字段呢?倒排索引是標記和包含它們的文檔的一個簡單列表。假如一個字段不存在,它就沒有任何標記,也就意味著它無法被倒排索引的數據結構表達出來。 本質上來說,`null`,`[]`(空數組)和 `[null]` 是相等的。它們都不存在于倒排索引中! 顯然,這個世界卻沒有那么簡單,數據經常會缺失字段,或包含空值或空數組。為了應對這些情形,Elasticsearch 有一些工具來處理空值或缺失的字段。 #### `exists` 過濾器 工具箱中的第一個利器是 `exists` 過濾器,這個過濾器將返回任何包含這個字段的文檔,讓我們用標簽來舉例,索引一些示例文檔: ```json POST /my_index/posts/_bulk { "index": { "_id": "1" }} { "tags" : ["search"] } <1> { "index": { "_id": "2" }} { "tags" : ["search", "open_source"] } <2> { "index": { "_id": "3" }} { "other_field" : "some data" } <3> { "index": { "_id": "4" }} { "tags" : null } <4> { "index": { "_id": "5" }} { "tags" : ["search", null] } <5> ``` <!-- SENSE: 080_Structured_Search/30_Exists_missing.json --> <1> `tags` 字段有一個值 <2> `tags` 字段有兩個值 <3> `tags` 字段不存在 <4> `tags` 字段被設為 `null` <5> `tags` 字段有一個值和一個 `null` 結果我們 `tags` 字段的倒排索引看起來將是這樣: | Token | DocIDs | |--------------|-------------| |`open_source` | `2` | |`search` | `1`,`2`,`5` | 我們的目標是找出所有設置了標簽的文檔,我們不關心這個標簽是什么,只要它存在于文檔中就行。在 SQL 語法中,我們可以用 `IS NOT NULL` 查詢: ```sql SELECT tags FROM posts WHERE tags IS NOT NULL ``` 在 Elasticsearch 中,我們使用 `exists` 過濾器: ```json GET /my_index/posts/_search { "query" : { "filtered" : { "filter" : { "exists" : { "field" : "tags" } } } } } ``` <!-- SENSE: 080_Structured_Search/30_Exists_missing.json --> 查詢返回三個文檔: ```json "hits" : [ { "_id" : "1", "_score" : 1.0, "_source" : { "tags" : ["search"] } }, { "_id" : "5", "_score" : 1.0, "_source" : { "tags" : ["search", null] } <1> }, { "_id" : "2", "_score" : 1.0, "_source" : { "tags" : ["search", "open source"] } } ] ``` <1> 文檔 5 雖然包含了一個 `null` 值,仍被返回了。這個字段存在是因為一個有值的標簽被索引了,所以 `null` 對這個過濾器沒有影響 結果很容易理解,所以在 `tags` 字段中有值的文檔都被返回了。只排除了文檔 3 和 4。 #### `missing` 過濾器 `missing` 過濾器本質上是 `exists` 的反義詞:它返回沒有特定字段值的文檔,像這條 SQL 一樣: ```sql SELECT tags FROM posts WHERE tags IS NULL ``` 讓我們在前面的例子中用 `missing` 過濾器來取代 `exists`: ```json GET /my_index/posts/_search { "query" : { "filtered" : { "filter": { "missing" : { "field" : "tags" } } } } } ``` <!-- SENSE: 080_Structured_Search/30_Exists_missing.json --> 如你所愿,我們得到了兩個沒有包含標簽字段的文檔: ```json "hits" : [ { "_id" : "3", "_score" : 1.0, "_source" : { "other_field" : "some data" } }, { "_id" : "4", "_score" : 1.0, "_source" : { "tags" : null } } ] ``` 什么時候 null 才表示 null 有時你需要能區分一個字段是沒有值,還是被設置為 `null`。用上面見到的默認行為無法區分這一點,數據都不存在了。幸運的是,我們可以將明確的 `null` 值用我們選擇的_占位符_來代替 當指定字符串,數字,布爾值或日期字段的映射時,你可以設置一個 `null_value` 來處理明確的 `null` 值。沒有值的字段仍將被排除在倒排索引外。 當選定一個合適的 `null_value` 時,確保以下幾點: * 它與字段的類型匹配,你不能在 `date` 類型的字段中使用字符串 `null_value` * 它需要能與這個字段可能包含的正常值區分開來,以避免真實值和 `null` 值混淆 #### 對象的 `exists/missing` `exists` 和 `missing` 過濾器同樣能在內聯對象上工作,而不僅僅是核心類型。例如下面的文檔: ```json { "name" : { "first" : "John", "last" : "Smith" } } ``` 你可以檢查 `name.first` 和 `name.last` 的存在性,也可以檢查 `name` 的。然而,在【映射】中,我們提到對象在內部被轉成扁平化的鍵值結構,像下面所示: ```json { "name.first" : "John", "name.last" : "Smith" } ``` 所以我們是怎么使用 `exists` 或 `missing` 來檢測 `name` 字段的呢,這個字段并沒有真正存在于倒排索引中。 原因是像這樣的一個過濾器 ```json { "exists" : { "field" : "name" } } ``` 實際是這樣執行的 ```json { "bool": { "should": [ { "exists": { "field": { "name.first" }}}, { "exists": { "field": { "name.last" }}} ] } } ``` 同樣這意味著假如 `first` 和 `last` 都為空,那么 `name` 就是不存在的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看