[Elasticsearch] 7.91つのフィールドでサポートされる最大文字数

ここに写真の説明を挿入

1。概要

1.1公式サイト

公式ウェブサイト:https://www.elastic.co/guide/en/elasticsearch/reference/current/ignore-above.html#ignore-above

ignore_above

ignore_above設定より長い文字列は、インデックス付けまたは保存されません。文字列配列の場合、ignore_aboveは各配列要素に個別に適用され、文字列要素の長さがignore_aboveより大きい場合、インデックス付けまたは保存されません。

_sourceこれがElasticsearchのデフォルト値である場合、すべての文字列/配列要素はこのフィールドに引き続き存在します。

# 1
PUT my-index-000001
{
    
    
  "mappings": {
    
    
    "properties": {
    
    
      "message": {
    
    
        "type": "keyword",
        "ignore_above": 20 
      }
    }
  }
}

# 2
PUT my-index-000001/_doc/1 
{
    
    
  "message": "Syntax error"
}

# 3
PUT my-index-000001/_doc/2 
{
    
    
  "message": "Syntax error with some long stacktrace"
}

# 4
GET my-index-000001/_search 
{
    
    
  "aggs": {
    
    
    "messages": {
    
    
      "terms": {
    
    
        "field": "message"
      }
    }
  }
}
  1. 20文字を超える文字列は、このフィールドでは無視されます。
  2. ドキュメントのインデックスが正常に作成されました。
  3. ドキュメントにはインデックスが付けられますが、メッセージフィールドにはインデックスが付けられません。
  4. 検索では2つのドキュメントが返されますが、用語の集計には最初のドキュメントのみが存在します。

このオプションは、Luceneの用語のバイト長制限32766を防ぐのにも役立ちます。

ignore_aboveの値は文字数ですが、Luceneはバイト数を計算します。非ASCII文字が多数含まれるUTF-8テキストを使用する場合は、制限を32766/4 =に設定することをお勧めし8191ます。これは、UTF-8文字が最大4バイトを占める可能性があるためです。

2.ビジネス

以下に複製:https://blog.csdn.net/laoyang360/article/details/78207980

ビジネスシステムでは、2つの問題が発生しました。

質問1:キーワードタイプフィールドとして設定します。コンテンツの長い大きなセクションを挿入した後、文字が例外を超えて挿入できません。
質問2:ignore_aboveで設定された長さを超えるフィールドを取得した後、結果を返すことはできません。

思考:Elasticsearchの1つのフィールドでサポートされる文字の最大数はいくつですか?

ignore_aboveを設定した後に拡張された質問:

2.1 ignore_aboveの役割は何ですか?

ESは、設定を超えて文字を設定するために使用され、インデックス付けまたは保存されません。

Strings longer than the ignore_above setting will not be indexed or stored.

2.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
  }
  }
  }
  }
}

2.3。キャラクターが指定された長さを超えたときに保存できますか?

上記のマッピングで設定されたurl、url_long、およびurl_long_long3フィールドのテーブル名を確認します。256文字を超えるURLを保存できます。

2.3.1キーワードタイプ、通常の長さの検証

挿入されたURLの長さは、次のように1705文字です。

post ali_test/ali_type/1
{
    
    
  "url" : "1705个字符的url....省略"
}

URL参照アドレス:

http://t.cn/zH6FHG7

探す:

GET ali_test/ali_type/_search
{
    
    
  "query": {
    
    
  "term": {
    
    
"url" : "1705个字符的url"

}
}
}

戻り結果:

{
    
    
  "took": 1,
  "timed_out": false,
  "_shards": {
    
    
  "total": 5,
  "successful": 5,
  "failed": 0
  },
  "hits": {
    
    
  "total": 0,
  "max_score": null,
  "hits": []
  }
}

結論:1705文字、url、url_long、url_long_longはすべて保存でき、結果はヘッドプラグインを介して確認できます。
ただし、URL用語検索では、返された結果を取得できません。理由:「ignore_above」:256がurlフィールドに設定されているため、256文字を超えた後はインデックスが作成されません。

ここに写真の説明を挿入

2.3.2キーワードタイプの場合、クリティカル長の検証

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
}

32766文字の投稿の後、正常に送信でき、返される結果は次のとおりです。

{
    
    
  "_index": "ali_test",
  "_type": "ali_type",
  "_id": "2000",
  "_version": 1,
  "result": "created",
  "_shards": {
    
    
  "total": 2,
  "successful": 2,
  "failed": 0
  },
  "created": true
}

結論:キーワードタイプのサポートされる最大長は、32766UTF-8タイプの文字です。
つまり、サポートされている用語の完全一致の最大長は32766UTF-8文字です。

2.4。拡張された質問:テキストタイプとキーワードタイプの保存文字数の違いは何ですか?

テキストタイプ:単語のセグメンテーションと全文検索をサポートしますが、集計と並べ替えの操作はサポートしません。
記事の詳細、コンテンツフィールドなどの大きなフィールドの保存に適しています。

キーワードタイプ:完全一致をサポートし、集計および並べ替え操作をサポートします。
url、name、title、その他のフィールドなどの正確なフィールドマッチングに適しています。
通常、テキストとキーワードは共存し、マッピングは次のように設定されます。

{
    
    
	"mappings": {
    
    
		"ali_type": {
    
    
			"properties": {
    
    
				"title_v1": {
    
    
					"analyzer": "ik_max_word",
					"type": "text",
					"term_vector": "with_positions_offsets",
					"fields": {
    
    
						"keyword": {
    
    
							"ignore_above": 256,
							"type": "keyword"
						}
					}
				}
			}
		}
	}
}

概要

ES5.Xバージョン以降、キーワードでサポートされる最大長は32766 UTF-8バイト(ビジネスシナリオに応じて決定される文字数については、公式ドキュメントの説明の最新バージョンを参照することをお勧めします)であり、テキストには文字長の制限はありません。

ignore_aboveを設定した後、指定された長さを超えるデータはインデックス付けされず、用語の完全一致によって結果を取得することはできません。

参照:

https://www.elastic.co/guide/en/elasticsearch/reference/current/ignore-above.html#ignore-above

おすすめ

転載: blog.csdn.net/qq_21383435/article/details/109276925