1. 程式人生 > >17.Elasticsearch單欄位支援的最大字元數

17.Elasticsearch單欄位支援的最大字元數

在業務系統中,遇到過兩個問題: 
問題1:設定為keyword型別的欄位,插入很長的大段內容後,報字元超出異常,無法插入。 
問題2:檢索超過ignore_above設定長度的欄位後,無法返回結果。

思考:Elasticsearch單欄位支援的最大字元數

設定ignore_above之後引申的問題:

1、ignore_above的作用?

ES中用於設定超過設定字元後,不被索引或者儲存。 
Strings longer than the ignore_above setting will not be indexed or stored.

2、ignore_above用法:

PUT ali_test
{
  "mappings"
: { "ali_type": { "properties": { "url": { "type":"keyword", "ignore_above":256 }, "url_long": { "type":"keyword" }, "url_long_long": { "type":"keyword", "ignore_above":32766 } } } } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3、當字元超過給定長度後,能否存入?

驗證表名,對於以上mapping中設定的url,url_long,url_long_long3個欄位。超過256字元的url,都可以存入。

3.1 keyword型別,普通長度驗證

插入url長度為:1705個字元,如下所示:

post ali_test/ali_type/1
{
  "url" : "1705個字元的url....省略"
}
  • 1
  • 2
  • 3
  • 4

檢索:

GET ali_test/ali_type/_search
{
  "query": {
  "term": {
"url" : "1705個字元的url"

}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

返回結果:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
  "total": 5,
  "successful": 5,
  "failed": 0
  }
, "hits": { "total": 0, "max_score": null, "hits": [] } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

結論:1705個字元,url、url_long、url_long_long都可以存入,可以通過head外掛檢視結果。 
但是url term檢索無法檢索返回結果,原因: url欄位設定了”ignore_above”:256,導致超出256個字元後不被索引。 
這裡寫圖片描述

3.2 對於keyword型別,臨界長度驗證

post 32767個字元的文件,報錯如下:

{
    "error":{
        "root_cause":[
            {
                "type":"illegal_argument_exception",
                "reason":"Document contains at least one immense term in field="url_long" (whose UTF8 encoding is longer than the max length 32766), all of which were skipped. Please correct the analyzer to not produce such terms. The prefix of the first immense term is: '[104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 103, 111, 111, 103, 108, 101, 46, 99, 111, 109, 47, 115, 101, 97, 114, 99, 104, 63, 104]...', original message: bytes can be at most 32766 in length; got 32767"
            }
        ],
        "caused_by":{
            "type":"max_bytes_length_exceeded_exception",
            "reason":"max_bytes_length_exceeded_exception: bytes can be at most 32766 in length; got 32767"
        }
    },
    "status":400
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

post 32766個字元後,能提交成功,返回結果如下:

{
  "_index": "ali_test",
  "_type": "ali_type",
  "_id": "2000",
  "_version": 1,
  "result": "created",
  "_shards": {
  "total": 2,
  "successful": 2,
  "failed": 0
  },
  "created": true
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

結論:keyword型別的最大支援的長度為——32766個UTF-8型別的字元。 
也就是說term精確匹配的最大支援的長度為32766個UTF-8個字元。

4、引申問題:text型別和keyword型別的儲存字元數區別?

text型別:支援分詞、全文檢索,不支援聚合、排序操作。 
適合大欄位儲存,如:文章詳情、content欄位等;

keyword型別:支援精確匹配,支援聚合、排序操作。 
適合精準欄位匹配,如:url、name、title等欄位。 
一般情況,text和keyword共存,設定mapping如下:

{
  "mappings": {
  "ali_type": {
  "properties": {
  "title_v1": {
  "analyzer":"ik_max_word",
  "type":"text",
  "term_vector" : "with_positions_offsets",
  "fields":{
  "keyword":{
  "ignore_above":256,
  "type":"keyword"
  }
  }
  }
  }
  }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

5、小結

ES5.X版本以後,keyword支援的最大長度為32766個UTF-8字元,text對字元長度沒有限制。

設定ignore_above後,超過給定長度後的資料將不被索引,無法通過term精確匹配檢索返回結果。

相關推薦

17.Elasticsearch支援字元

在業務系統中,遇到過兩個問題: 問題1:設定為keyword型別的欄位,插入很長的大段內容後,報字元超出異常,無法插入。 問題2:檢索超過ignore_above設定長度的欄位後,無法返回結果。思考:Elasticsearch單欄位支援的最大字元數?設定ignore_abov

js把頁面明細行資料多個組成陣列,並獲取某個和其次的資料賦值到文字框;

要求:前臺新增頁面的明細行中,有列下拉框選擇分類和一列付款金額的輸入框,明細行上面有兩個輸入框,要求在明細行選擇的分類和付款金額中篩選付款金額之和第一高的的分類和金額、第二高的分類和金額自動複製到上面的兩個輸入框中; 思路:迴圈明細表,把所有的明細表的分類和付款金額放到json陣列中,然後迴圈j

poj 1050_To the max(需要轉換思維,求一個問題)

分析:  對於此題,首先可以想到的有字首和,這個題的關鍵也是字首和,但是怎麼設計這個字首和是一個好問題。           通常我們所用的字首和大多都是在一維陣列上,可以通過一維陣列中的字首和來求得在一維陣列上求一個欄位,且使欄位的和最大這個問題。推廣到二維陣列,二維陣列

poj 2018_Best Cow Fences (求數列中一個問題,的長度不小於L)

想要理解這個問題我們需要先掌握幾個要點: 1、對於一個序列,求一個欄位它的和最大,沒有“長度不小於L的限制”問題。 2、對於一個序列,求一個欄位它的和最大,欄位的長度不小於L的問題。 欄位和可以轉化成為字首和相減的形式,也就是說sumi=(a1+a2+...+ai)

sql查詢表中某個值相同,其他值的記錄

SELECT a.* FROM user a WHERE not EXISTS( select 1 from user where name = a.name and age > a.age ) 對user表進行掃描,編號(或姓名)相同情況下,沒有比前邊年齡大

hibernate實現表聯查並獲取某個值(隨筆)

最近試用hibernate實現三表連線查詢並分組顯示某個欄位的最大值,在mysql中語句可以執行,改成hql無法執行,遂寫下隨筆以記錄 mysql中查詢,可以查詢到相應的結果 改寫成hql語句 "select o.equipment.equId, o.olderName

SQLLOAD報資料檔案的超出長度錯誤

SQLLOAD資料的時候,建表給的欄位給夠了,建表已經給到VHARCHAR2(1024)了,實際資料是VHARCHAR2(256).載入報錯"資料檔案的欄位超出最大長度"查了半天,發現問題在於,前人CTL檔案為了圖方便,以 LOAD #INFILE '#/aps_userl

Yii裡查詢某個值和小值

求某個型別的最大值和最小值 $sql = "SELECT min(欄位) as 自定義1, max(欄位) as 自定義2 FROM article"; $變數 = Yii::app() ->

MySQL根據某一個或者多個查詢重複資料,並且保留某的記錄

問題場景 當系統沒有處理好併發操作的情況下,操作人員同時操作一張表的情況下,資料庫有可能被插入相同記錄,這些會帶來隱藏的bug。 解決思路一 解決併發操作的衝突。 解決思路二 對資料庫(MySQL)某張表去重,首先確定你的業務是否允許重複,不允許你

請教oracle的CLOB長度

                CLOB和BLOB都是4G,而LONG ,LONG raw是舊時代的oracle二進位制和長文字表示,將來會被廢棄。最長長度是2G.單位是Byte表中單個 LOB 欄位 在 9i  版本中可儲存 4GB 資料, 在 10g 版本中可儲存多達 128TB 的資料.所以理論上是沒限

查詢某字元內容小長度

當查詢一個字元欄位的最大最小長度時,可以用下面的語句select max(len),min(len) from (select length(data_guid) len from adam_entity_datas)

sql如何找到某值所在行

首先,查詢某欄位的最大值 select max(weight) from apple; 7888 接著,根據最大值,查詢其所在行 select * from apple where weigh

EditText限制字元(中文,字母,數字)

限定EditText輸入個數的解決方案很多,但是一般主要考慮兩點,也就是處理兩件事:(1)不同語言字元(英文、中文等)處理方式(2)輸入字元達到數目後,是否仍然允許使用者輸入 第一點,涉及的東東其實蠻多,不同語言在不同編碼中佔據位元組數等,不同語言在U8等編碼的表示範圍等,

iOS UITextField限制輸入長度不能超過字元(需要考慮中英文的情況)

_walletNameTextField = [[CommonTextField alloc] initWithText:nil placeHolder:NSLocalizedString(@"設定錢包名稱(不超過25個字元)", nil)];

PAE——使32系統支援64G記憶體

1 PAE Physical Address Extension(PAE,中文譯名:實體地址擴充套件)技術最初是為了彌補32位地址在PC伺服器應用上的不足而推出的。我們知道,傳統的IA32架構只有32位地址匯流排,只能讓系統容納不超過4GB的記憶體,這麼大的記憶體,對於普

求陣列簡潔有效的演算法

直接上程式碼:public static int max(int[] a){ int max = 0;int zmax = 0; for (int i = 0;i<a.length;i++){ zmax += a[

為什麽32機器只能用到4GB內存

必須 lan 組成 討論 bit 大小 mage 技術分享 同時 在此之前先來了解一些計算機存儲單位之間的關系以及計算機系統結構和PC硬件方面的一些知識。 一、計算機存儲單位之間的關系 位 bit (Binary Digits):存放一位二進制數,即 0 或 1,

kuangbin專題七 HDU1754 I Hate It (點修改維護值)

cond color include 專題 一次 span 修改 信息 \n 很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。 這讓很多學生很反感。 不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫一個程序,模擬老師的

poj3615 給你一個有向圖,然後對於特定的點A與B,要你求出A到B之間所有可行路徑的段路距離值的小值.

#include<cstdio> #include<algorithm> #define INF 1e9 using namespace std; const int maxn = 300+10; int n,m,t; int d[maxn][maxn]; void floy

Elasticsearch搜尋

查詢很少是對一個欄位做 match 查詢,通常都是一個 query 查詢多個欄位,比如一個 doc 有 title、content、pagetag 等文字欄位,要在這些欄位查詢含多個 term 的 query,就要對它們的相關度評分做合理的合併。這被稱為多詞(multiword)、多欄位(multifield