1. 程式人生 > >ES學習之單個索引對映多個型別

ES學習之單個索引對映多個型別

在ES6.0.0及更高的版本中,建立的索引只能包含一個對映型別。在6.0.0以下的版本中建立的一個索引對映多個型別的索引在6.0.0版本中繼續發揮作用,但是將在7.0.0中完全刪除。

自第一次釋出彈出式搜尋以來,每個文件都儲存在一個索引中,並分配一個對映型別。對映型別用於表示被索引的文件或實體的型別,例如Twitter索引可能具有user型別和tweet型別。

每個對映型別都可以有自己的欄位,因此使用者型別可能有一個FuleNyNoX欄位、一個使用者名稱稱欄位和一個電子郵件欄位,而Twitter型別可以有一個內容欄位、一個TwiteEdEdAT欄位和一個使用者型別,一個使用者名稱稱欄位。

每個文件都有一個包含型別名稱的“型別”元欄位,並且可以通過指定URL中的型別名稱來限制搜尋到一個或多個型別:

GET twitter/user,tweet/_search
{
  "query": {
    "match": {
      "user_name": "kimchy"
    }
  }
}

_type欄位和文件的_id欄位結合生成一個UUID欄位,因此在同一個索引中可以存在不同型別的具有相同SyID的文件。

為什麼刪除多個型別對映?

我們談到了一個類似於SQL資料庫中的“資料庫”的“索引”,一個“型別”相當於一個“表”。

這是一個糟糕的類比,導致了錯誤的假設。在SQL資料庫中,表是相互獨立的。一個表中的列與另一個表中具有相同名稱的列沒有關聯。這不是對映型別中的欄位的情況。

在彈性搜尋索引中,在不同的對映型別中具有相同名稱的欄位由相同的Lucene欄位在內部支援。換句話說,使用上面的示例,使用者型別中的UsRyNoNd欄位與Twitter型別中的UsSeriNoX欄位完全相同的欄位,並且兩個使用者名稱稱欄位必須在兩種型別中都具有相同的對映(定義)。

例如,當您希望刪除一個型別中的日期欄位和在同一索引中的另一個型別中的布林欄位時,這可能會導致挫折。

除此之外,在同一索引中儲存很少或沒有相同欄位的不同實體會導致稀疏資料並干擾Lucene高效壓縮文件的能力。

如何解決多個型別對映問題?

第一種選擇是每個文件型別都有索引。您可以在推特索引和使用者索引中儲存Twitter,而不是在單個Twitter索引中儲存Twitter和使用者。索引是完全獨立的,因此在索引之間不會有欄位型別衝突。
這種方法有兩個好處:

  • 資料更可能是密集的,因此受益於Lucene中使用的壓縮技術。
  • 在全文搜尋中用於評分的術語更可能是準確的,因為同一索引中的所有文件都代表單個實體。
    每個索引可以適當地為它包含的文件的數量大小:你可以為user使用較少數量的分片和用於Twitter的更大數量的分片。

當然,在叢集中存在多少個主碎片是有限度的,所以您可能不想浪費一個只有幾千個文件集合的碎片。在這種情況下,您可以實現自己的自定義型別欄位,該欄位將以類似於舊型別的方式工作。

舊的實現方式:

PUT twitter
{
  "mappings": {
    "user": {
      "properties": {
        "name": { "type": "text" },
        "user_name": { "type": "keyword" },
        "email": { "type": "keyword" }
      }
    },
    "tweet": {
      "properties": {
        "content": { "type": "text" },
        "user_name": { "type": "keyword" },
        "tweeted_at": { "type": "date" }
      }
    }
  }
}

PUT twitter/user/kimchy
{
  "name": "Shay Banon",
  "user_name": "kimchy",
  "email": "shay@kimchy.com"
}

PUT twitter/tweet/1
{
  "user_name": "kimchy",
  "tweeted_at": "2017-10-24T09:00:00Z",
  "content": "Types are going away"
}

GET twitter/tweet/_search
{
  "query": {
    "match": {
      "user_name": "kimchy"
    }
  }
}

我們可以通過新增自定義型別欄位來實現相同的事情:
新的實現方式:

PUT twitter
{
  "mappings": {
    "doc": {
      "properties": {
        "type": { "type": "keyword" }, 
        "name": { "type": "text" },
        "user_name": { "type": "keyword" },
        "email": { "type": "keyword" },
        "content": { "type": "text" },
        "tweeted_at": { "type": "date" }
      }
    }
  }
}

PUT twitter/doc/user-kimchy
{
  "type": "user", 
  "name": "Shay Banon",
  "user_name": "kimchy",
  "email": "shay@kimchy.com"
}

PUT twitter/doc/tweet-1
{
  "type": "tweet", 
  "user_name": "kimchy",
  "tweeted_at": "2017-10-24T09:00:00Z",
  "content": "Types are going away"
}

GET twitter/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "user_name": "kimchy"
        }
      },
      "filter": {
        "match": {
          "type": "tweet" 
        }
      }
    }
  }
}

以前,父子關係是由一個對映型別為父函式和一個或多個其他對映型別的子代來表示的。沒有型別,我們就不能再使用這個語法了。父子特徵將一如既往地起作用,除了表示文件之間關係的方式已被更改為使用新的聯接欄位。

各個版本對型別操作的變化如下:

Elasticsearch 5.6.0

  • Setting index.mapping.single_type: true on an index will enable the
    single-type-per-index behaviour which will be enforced in 6.0.
  • The join field replacement for parent-child is available on indices
    created in 5.6.

Elasticsearch 6.x

  • Indices created in 5.x will continue to function in 6.x as they did
    in 5.x.
  • Indices created in 6.x only allow a single-type per index. Any name
    can be used for the type, but there can be only one.
  • The _type name can no longer be combined with the _id to form the
    _uid field. The _uid field has become an alias for the _id field.
  • New indices no longer support the old-style of parent/child and
    should use the join field instead. The _default_ mapping type is
    deprecated.

Elasticsearch 7.x

  • The type parameter in URLs are optional. For instance, indexing a
    document no longer requires a document type.
  • The GET|PUT _mapping APIs support a query string parameter
    (include_type_name) which indicates whether the body should include a
    layer for the type name. It defaults to true. 7.x indices which don’t
    have an explicit type will use the dummy type name _doc.
  • The _default_ mapping type is removed.

Elasticsearch 8.x

  • The type parameter is no longer supported in URLs.
  • The include_type_name parameter defaults to false.

Elasticsearch 9.x

  • The include_type_name parameter is removed.

The Reindex API 可以用於將多型別索引轉換為單型別索引:

這個第一個例子把我們的Twitter索引分成一個tweet索引和一個user索引:

PUT users
{
  "settings": {
    "index.mapping.single_type": true
  },
  "mappings": {
    "user": {
      "properties": {
        "name": {
          "type": "text"
        },
        "user_name": {
          "type": "keyword"
        },
        "email": {
          "type": "keyword"
        }
      }
    }
  }
}

PUT tweets
{
  "settings": {
    "index.mapping.single_type": true
  },
  "mappings": {
    "tweet": {
      "properties": {
        "content": {
          "type": "text"
        },
        "user_name": {
          "type": "keyword"
        },
        "tweeted_at": {
          "type": "date"
        }
      }
    }
  }
}

POST _reindex
{
  "source": {
    "index": "twitter",
    "type": "user"
  },
  "dest": {
    "index": "users"
  }
}

POST _reindex
{
  "source": {
    "index": "twitter",
    "type": "tweet"
  },
  "dest": {
    "index": "tweets"
  }
}

自定義型別欄位

下一個示例新增自定義型別欄位,並將其設定為原始型別的值。它還將型別新增到yid中,以防存在不同型別的具有衝突ID的文件:

PUT new_twitter
{
  "mappings": {
    "doc": {
      "properties": {
        "type": {
          "type": "keyword"
        },
        "name": {
          "type": "text"
        },
        "user_name": {
          "type": "keyword"
        },
        "email": {
          "type": "keyword"
        },
        "content": {
          "type": "text"
        },
        "tweeted_at": {
          "type": "date"
        }
      }
    }
  }
}


POST _reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  },
  "script": {
    "source": """
      ctx._source.type = ctx._type;
      ctx._id = ctx._type + '-' + ctx._id;
      ctx._type = 'doc';
    """
  }
}

相關推薦

ES學習單個索引對映型別

在ES6.0.0及更高的版本中,建立的索引只能包含一個對映型別。在6.0.0以下的版本中建立的一個索引對映多個型別的索引在6.0.0版本中繼續發揮作用,但是將在7.0.0中完全刪除。 自第一次釋出彈出式搜尋以來,每個文件都儲存在一個索引中,並分配一個對映型別。

mybatis3.1-[topic-18-20]-_對映檔案_引數處理_單個引數&引數&命名引數 _POJO&Map&TO 三種方式及舉例

筆記要點出錯分析與總結 /**MyBatis_對映檔案_引數處理_單個引數&多個引數&命名引數 * _POJO&Map&TO 三種方式及舉例 _ * 單個引數 : #{引數名} ,取出引數值; [mybatis 不會做特殊處理]

JAXB的應用二---------Xml與物件的對映(聚合或組合)及注意事項

   在我們的實際應用中,Xml中的結構往往不止這麼簡單,一般都會有2,3層。也就是說如果對映成物件就是聚合(組合)的情況 。 就用我們上一章的例子繼續來講,簡單我們的Book的author現在不止是一個String型別的名子,他是一個物件Author,幷包含作者的相關個人

easypoi導出單個sheet和sheet

簡單 取數據 logs 註解 ont log 導出 image 研究 今天有時間研究了一下easypoi,感覺使用了easypoi導出excel方便了很多,不用寫很多復雜的反射,只需要使用註解和一些工具類就可以實現常用的excel的導出,接下來介紹一下easypoi如何導出

一、WCF學習旅-創建第一服務

img image pub 頁面 添加服務 ets art idt null WCF基本介紹:http://baike.baidu.com/link?url=TGjLYt3HS4dt4-hIiGRknLy6udRsZ52QxJz9cmRKlR4NXbP9rCZDsKn2fD

java學習路--繼承(態的動態綁定)

程序 有一個 完全 報錯 參數類型 其中 完全匹配 一個 執行過程 動態綁定過程中,對象調用對象方的執行過程   1:編譯器查看對象的聲明類型和方法名。有可能有多個方法名相同,但參數類型不一樣的重載方法。   2:編譯器查看調用方法時提供的參數類型。該過程叫重載解析,在相同

python爬蟲scrapy如何同時執行scrapy爬行任務

還需 學習 lis 參數 文件名 其中 .project 自定義 com 背景:   剛開始學習scrapy爬蟲框架的時候,就在想如果我在服務器上執行一個爬蟲任務的話,還說的過去。但是我不能每個爬蟲任務就新建一個項目吧。例如我建立了一個知乎的爬行任務,但是我在這個爬行任務中

180217_JAVA學習_TreeSet中存放含String的類並設置排序規則

排序 n) color span spa rgs address for out 有Person類如下: 1 class Person { 2   String name; 3   int age; 4   String address; 5 } 有main如下:

Map一個Key存Value的MultiValueMap(一個鍵值)

arrays set for get work article () buffer 很好 原鏈接:https://blog.csdn.net/yanzhenjie1003/article/details/51550264 MultiValueMap可以讓一個key對應多個v

Python中正則表示式對單個字元,字元,匹配邊界等使用

         Regular Expression,正則表示式,又稱正規表示式、正規表示法、正則表示式、規則表示式、常規表示法(英語:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),是電腦科學的一個概

java併發程式設計使用 CountDownLatch 控制執行緒執行順序

有時候會有這樣的需求,多個執行緒同時工作,然後其中幾個可以隨意併發執行,但有一個執行緒需要等其他執行緒工作結束後,才能開始。舉個例子,開啟多個執行緒分塊下載一個大檔案,每個執行緒只下載固定的一截,最後由另外一個執行緒來拼接所有的分段,那麼這時候我們可以考慮使用CountDownLatch來控制併發。

Python字典中的鍵對映值(列表或者集合)

一個字典就是一個鍵對應一個單值的對映。如果你想要一個鍵對映多個值,那麼你就需要將這多個值放到另外的容器中, 比如列表或者集合裡面。比如,你可以像下面這樣構造這樣的字典: d = { 'a' : [1, 2, 3], 'b' : [4, 5] } e = { 'a'

SpringBoot學習筆記(12)----SpringBoot實現 賬號輪詢傳送郵件

  首先,引入傳送郵件的依賴,由於freemarker自定義模板,所以也需要把freemarker的依賴引入   pom.xml檔案 <dependency> <groupId>org.springframework.boot</groupId

Windows 2012設定允許單個使用者連線會話的方法

WINDOWS 2012 伺服器預設只允許單個使用者連線一個遠端桌面會話,如果已有連線登陸,另外的連線再登陸會踢掉之前的連線。如果需要兩個遠端桌面同時連線   找到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Serv

Linux學習網路程式設計(程序併發伺服器)

言之者無罪,聞之者足以戒。 - “詩序” 上面我們所說過的通訊都是一個伺服器一個客戶端之間的通訊,下面我們來交流一下多程序併發伺服器的相關知識 邏輯上就是這個樣子的,就是一個伺服器多個客戶端進行資料的傳輸。 1、傳送資料的函式: ssize_t send(int sockfd,

Unity3d學習路-初識GameSparks人遊戲外掛

初識GameSparks多人遊戲外掛 初識GameSparks多人遊戲外掛 簡介 GameSparks介紹 建立遊戲 雲服務配置

索引單列索引

參考文章: http://blog.csdn.net/wulex/article/details/69540136 http://blog.csdn.net/gol_phing/article/details/47100619 在關係資料庫中,索引是一種單獨的、物理的對資料庫表中

nginx實現對映域名和負載均衡

當前我有2個網站,都需要部署上去,但是無奈,雲服務只有一臺,在買一臺的話就又太費錢,所以利用了nginx的多域名配置,從而實現利用一個 ip 訪問不同的域名,也節省了開支   配置方法也相對比較簡單,在nginx.conf配置檔案中 配置多個server 即可 user nob

Struts2學習筆記:DMI,配置檔案,預設Action,字尾

動態方法呼叫有三種方法: 1.同一Action多次對映,每個action標籤的method對應要呼叫的方法。 當要呼叫的方法多了就會增加struts.xml檔案的複雜性。 2.struts.DynamicMethodInvocation=true (struts.properties檔案) 或<

Struts2單個檔案和檔案上傳

<一>簡述: Struts2的檔案上傳其實也是通過攔截器來實現的,只是該攔截器定義為預設攔截器了,所以不用自己去手工配置,<interceptor name=”fileUpload” class=”org.apache.struts2.interceptor.