目次
1. ドキュメントのバッチ操作
1. _mget (文書データを一括取得)
(1) URLにインデックスと型を指定しないリクエストメソッド
: GET
リクエストアドレス: _mget
機能説明: インデックス(インデックスライブラリ)と型(テーブル)を持たないデータをidで取得
リクエストパラメータ:
"docs":[
{
"_index":"索引库名称",
"_type":"类型默认是_doc",
"_id":主键
}, #多个条件使用逗号分割
{
.............
}
]
_type は es7 以降のデフォルトです。
ES ステートメントの例:
我是查询的两个索引库(test_index01,test_index02)
GET _mget
{
"docs":[
{
"_index":"test_index01",
"_id":1
},
{
"_index":"test_index02",
"_id":1
}
]
}
結果
{
"docs" : [
{
"_index" : "test_index01",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 3,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "秀儿",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
},
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "1",
"_version" : 3,
"_seq_no" : 2,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "李四",
"sex" : 1,
"age" : 28,
"address" : "北京",
"remark" : "java"
}
}
]
}
(2) URL にインデックスリクエストメソッドを指定します
。 GET
リクエストアドレス: GET /インデックスライブラリ名/_mget
関数説明: 指定されたインデックスライブラリの内容を一括クエリ
リクエストパラメータ:
GET /索引库名称/_mget
{
"docs":[
{
"_id":主键id
},
{
"_id":主键id
}
]
}
例
GET /test_index01/_mget
{
"docs":[
{
"_id":1
},
{
"_id":2
}
]
}
結果
{
"docs" : [
{
"_index" : "test_index01",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 3,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "秀儿",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
},
{
"_index" : "test_index01",
"_type" : "_doc",
"_id" : "2",
"found" : false
}
]
}
2. _bulk(文書データを一括作成)
put メソッドと post メソッドについては前の記事ですでに説明しましたが、ここでは 2 つのメソッドを自分で実行して違いを確認します。以下、投稿形式で解説していきます。
(1)
インデックスや URL の入力を指定せずに文書を一括作成する
リクエストメソッド:POST
リクエストアドレス:_bulk
機能説明:文書データの追加、削除、変更
リクエストパラメータ:
通常 2 行(または多数行)のパラメータ
1 行目: 操作の種類 (追加、削除、変更) と操作のオブジェクト (インデックス、タイプ、ID) を指定します
2 行目: 操作のデータ
1 {
"actionName":{
"_index":"indexName", "_type":"typeName","_id":"id"}}
2 {
"field1":"value1", "field2":"value2"}
POST _bulk
{
"操作类型(create,index,delete,update)":{
"_index":"索引库名称", "_type":"类型(7.x以后版本可省略)", "_id":指定主键}}
{
"title":"文档数据具体内容","content":"文档数据具体内容","tags":["文档数据具体内容", "文档数据具体内容"]}
例:
ここでの id:3 は es の主キーではなく、企業内の ID です es の主キーは次の_id:9
ようになります
POST _bulk
{
"create":{
"_index":"test_index03", "_id":9}}
{
"id":3,"title":"1","content":"111","tags":["java", "面向对象"]}
{
"create":{
"_index":"test_index03","_id":810}}
{
"id":4,"title":"2","content":"222","tags":["java", "面向对象"]}
結果
{
"took" : 3,
"errors" : false,
"items" : [
{
"create" : {
"_index" : "test_index03",
"_type" : "_doc",
"_id" : "9",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 12,
"_primary_term" : 1,
"status" : 201
}
},
{
"create" : {
"_index" : "test_index03",
"_type" : "_doc",
"_id" : "810",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 13,
"_primary_term" : 1,
"status" : 201
}
}
]
}
(2) 通常はインデックスの作成または置換を行いますが、
元の文書が存在しない場合は作成し、
存在する場合は元の文書を完全に修正します
。
POST _bulk
{
"index":{
"_index":"article", "_id":99}}
{
"title":"1","content":"2222","tags":["333", "444"]}
結果
{
"took" : 5,
"errors" : false,
"items" : [
{
"index" : {
"_index" : "article",
"_type" : "_doc",
"_id" : "99",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 1,
"status" : 201
}
}
]
}
再度実行すると、結果は「result」:「updated」となります。
{
"took" : 2,
"errors" : false,
"items" : [
{
"index" : {
"_index" : "article",
"_type" : "_doc",
"_id" : "99",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1,
"status" : 200
}
}
]
}
3. _bulk(文書データを一括削除)
インデックスを指定せず、 URL に入力します
。 リクエストメソッド: POST
リクエストアドレス: _bulk
機能説明: インデックスライブラリのドキュメントコンテンツをバッチで削除します。
リクエストパラメータ:
POST _bulk
{
"delete":{
"_index":"索引库名称", "_id":es主键}}
例
POST _bulk
{
"delete":{
"_index":"test_index03", "_id":3}}
{
"delete":{
"_index":"test_index03", "_id":4}}
結果
{
"took" : 3,
"errors" : false,
"items" : [
{
"delete" : {
"_index" : "test_index03",
"_type" : "_doc",
"_id" : "3",
"_version" : 7,
"result" : "deleted",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 14,
"_primary_term" : 1,
"status" : 200
}
},
{
"delete" : {
"_index" : "test_index03",
"_type" : "_doc",
"_id" : "4",
"_version" : 7,
"result" : "deleted",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 15,
"_primary_term" : 1,
"status" : 200
}
}
]
}
4. _bulk (ドキュメントデータをバッチで変更)
インデックスを指定せず、 URL に入力します
。 リクエストメソッド: POST
リクエストアドレス: _bulk
機能の説明: ドキュメントデータをバッチで変更します
リクエストパラメータ:
POST _bulk
{
"update":{
"_index":"索引库名称", "_id":es主键}}
{
"doc":{
"更新的字段名称":"更新内容"}}
例
POST _bulk
{
"update":{
"_index":"test_index03", "_id":3}}
{
"doc":{
"title":"ES"}}
{
"update":{
"_index":"test_index03", "_id":4}}
{
"doc":{
"content":"修改内容"}}
結果(以前は削除し、追加後に修正しました)
{
"took" : 35,
"errors" : false,
"items" : [
{
"update" : {
"_index" : "test_index03",
"_type" : "_doc",
"_id" : "3",
"_version" : 3,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 20,
"_primary_term" : 1,
"status" : 200
}
},
{
"update" : {
"_index" : "test_index03",
"_type" : "_doc",
"_id" : "4",
"_version" : 3,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 21,
"_primary_term" : 1,
"status" : 200
}
}
]
}
2. DSL言語による高度なクエリ
1。概要
Domain Specific Language (ドメイン固有言語)
Elasticsearch は、クエリを定義するための JSON ベースの DSL を提供します。
DSL は、リーフ クエリ句と複合クエリ句の 2 つの句で構成されます。
2. クエリ条件なし
無条件クエリ、デフォルトのクエリすべて
GET /test_index03/_doc/_search
{
"query":{
"match_all":{
}
}
}
3. クエリ条件がある
3.1 リーフ条件クエリ(単一フィールドのクエリ条件)
(1) ファジークエリ
ファジー マッチングは主にテキスト タイプのフィールドに使用されます。テキスト タイプのフィールドはテキスト コンテンツをセグメント化します。クエリを実行すると、クエリの条件によって渡されたコンテンツもセグメント化され、転置インデックスを通じて一致するデータが検索されます。ファジー マッチングは主に match などのパラメータを通じて実装されます。。
①match:一致キーワードによるあいまい一致条件の内容
②prefix:前方一致の一致
③regexp:正規表現によるデータの一致
match的复杂用法
- 一致条件は次のパラメータもサポートしています。
- query : 照合する値を指定します
- 演算子: 一致条件のタイプ
- and : 条件付き単語分割後の一致
- or : 条件付き単語の分割後に一致するものが 1 つだけあります (デフォルト)
- minmum_Should_match : 一致の最小数を指定します
(2) 完全一致
- 用語 : 単一の条件が等しい
- term : 単一のフィールドは値の配列内の値に属します
- range : フィールドは値の範囲に属します
- 存在する : 特定のフィールドの値が存在するかどうか
- ids: ID によるバッチクエリ
3.2 複合条件クエリ(複数条件クエリ)
結合条件付きクエリは、リーフ条件付きクエリ ステートメントを結合して形成される完全なクエリ条件です。
- bool: 条件間に and または not の関係があります。
- 必須: 各条件が満たされる必要があります。つまり、各条件は と に関連しています。
- should: 各条件のうち 1 つだけが満たされます。つまり、各条件が OR 関係にあります。
- must_not: すべての条件が満たされるわけではありません。つまり、各条件が満たされません。
- filter: 関連性スコアを計算しません。関連性スコアである _score を計算しないため、より効率的です。
- constant_score: 関連性スコアを計算しません
must/filter/shoud/must_not
等しいというサブ条件は、
term/terms/range/ids/exists/match
等しいリーフ条件によってパラメータとして渡されます。
3.3 結合クエリ(複数ドキュメントの結合クエリ)
- 親子ドキュメントクエリ: 親/子
- ネストされたドキュメント クエリ: ネストされた
3.4 クエリ DSL とフィルター DSL の違い
DSL クエリ言語には、クエリとフィルターの 2 種類があります。
4. クエリ例
4.1 用語クエリ
term查询不会对字段进行分词查询
、完全一致を使用します
正確なクエリには用語を使用し、クエリ フィールドのマッピング タイプはキーワードです (マッピング関連情報についてはカタログを参照してください)。
コンテンツのインデックス化
GET /test_index02/_search
{
"query":{
"match_all":{
}
}
}
結果
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "秀儿",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
},
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "C9bd_IYBuSAClcwx8fGZ",
"_score" : 1.0,
"_source" : {
"name" : "李四",
"sex" : 1,
"age" : 28,
"address" : "北京",
"remark" : "java"
}
}
]
}
}
例1
POST /test_index02/_search
{
"query":{
"term":{
"age":"28"
}
}
}
結果
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "李四",
"sex" : 1,
"age" : 28,
"address" : "北京",
"remark" : "java"
}
}
]
}
}
示例2
POST /test_index02/_search
{
"query":{
"term":{
"name":"秀儿"
}
}
}
結果
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
}
}
示例3
POST /test_index02/_search
{
"query":{
"term":{
"name.keyword":"秀儿"
}
}
}
結果
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.6931471,
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.6931471,
"_source" : {
"name" : "秀儿",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
}
]
}
}
4.2ファジークエリの一致
match会根据该字段的分词器,进行分词查询
例
POST /test_index02/_search
{
"from":0,
"size":2,
"query":{
"match":{
"name":"秀儿"
}
}
}
結果
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.3862942,
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.3862942,
"_source" : {
"name" : "秀儿",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
}
]
}
}
4.3 multi_match 複数フィールドあいまい一致クエリと指定フィールドクエリ
ここでは簡単なデモを示しますので、より詳細な方法についてはご自身で理解していただく必要があります。
すべてのデータにインデックスを付ける
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "秀儿",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
},
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "DNbg_IYBuSAClcwx4fEv",
"_score" : 1.0,
"_source" : {
"name" : "李四",
"sex" : 1,
"age" : 28,
"address" : "北京",
"remark" : "java"
}
},
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "Ddbm_IYBuSAClcwxbfER",
"_score" : 1.0,
"_source" : {
"name" : "王五",
"sex" : 1,
"age" : 28,
"address" : "北京",
"remark" : "秀儿多字段"
}
},
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "Dtbv_IYBuSAClcwx5fFw",
"_score" : 1.0,
"_source" : {
"name" : "赵六",
"sex" : 1,
"age" : 28,
"address" : "秀儿",
"remark" : "python"
}
}
]
例(フィールドを指定)
POST /test_index02/_search
{
"query":{
"multi_match":{
"query":"秀儿",
"fields":[
"remark",
"name"
]
}
}
}
結果
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.9616582,
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.9616582,
"_source" : {
"name" : "秀儿",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
},
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "Ddbm_IYBuSAClcwxbfER",
"_score" : 1.3921447,
"_source" : {
"name" : "王五",
"sex" : 1,
"age" : 28,
"address" : "北京",
"remark" : "秀儿多字段"
}
}
]
}
}
例 2
POST /test_index02/_search
{
"query":{
"multi_match":{
"query":"秀儿"
}
}
}
結果
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 2.4079456,
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "1",
"_score" : 2.4079456,
"_source" : {
"name" : "秀儿",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
},
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "Dtbv_IYBuSAClcwx5fFw",
"_score" : 1.9333868,
"_source" : {
"name" : "赵六",
"sex" : 1,
"age" : 28,
"address" : "秀儿",
"remark" : "python"
}
},
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "Ddbm_IYBuSAClcwxbfER",
"_score" : 1.5779729,
"_source" : {
"name" : "王五",
"sex" : 1,
"age" : 28,
"address" : "北京",
"remark" : "秀儿多字段"
}
}
]
}
}
例 3 (ワイルドカードを使用するフィールド)
POST /test_index02/_search
{
"query":{
"multi_match":{
"query":"秀儿",
"fields":[
"address",
"na*"
]
}
}
}
結果
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 2.4079456,
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "1",
"_score" : 2.4079456,
"_source" : {
"name" : "秀儿",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
},
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "Dtbv_IYBuSAClcwx5fFw",
"_score" : 1.9333868,
"_source" : {
"name" : "赵六",
"sex" : 1,
"age" : 28,
"address" : "秀儿",
"remark" : "python"
}
}
]
}
}
4.4query_string 未指定フィールドおよび指定フィールド条件クエリ (AND および OR 条件を含む)
AND 和 OR 需要大写
不特定の例
POST /test_index02/_search
{
"query":{
"query_string":{
"query":"王五 OR 李四"
}
}
}
結果
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 2.4079456,
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "DNbg_IYBuSAClcwx4fEv",
"_score" : 2.4079456,
"_source" : {
"name" : "李四",
"sex" : 1,
"age" : 28,
"address" : "北京",
"remark" : "java"
}
},
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "Ddbm_IYBuSAClcwxbfER",
"_score" : 2.4079456,
"_source" : {
"name" : "王五",
"sex" : 1,
"age" : 28,
"address" : "北京",
"remark" : "秀儿多字段"
}
}
]
}
}
不特定の例
POST /test_index02/_search
{
"query":{
"query_string":{
"query":"王五 AND 秀儿"
}
}
}
結果
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 3.9859185,
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "Ddbm_IYBuSAClcwxbfER",
"_score" : 3.9859185,
"_source" : {
"name" : "王五",
"sex" : 1,
"age" : 28,
"address" : "北京",
"remark" : "秀儿多字段"
}
}
]
}
}
フィールドを指定する例 (フィールドではワイルドカードが使用されておりna*
、ここでは 1 つの名前フィールドのみが一致します)
POST /test_index02/_search
{
"query":{
"query_string":{
"query":"王五 OR 张三",
"fields":[
"address",
"na*"
]
}
}
}
結果
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 2.4079456,
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "Ddbm_IYBuSAClcwxbfER",
"_score" : 2.4079456,
"_source" : {
"name" : "王五",
"sex" : 1,
"age" : 28,
"address" : "北京",
"remark" : "秀儿多字段"
}
}
]
}
}
4.5 範囲範囲クエリ
gte 以上、lte 以下、gt より大きく、lt より小さい。
例
POST /test_index02/_search
{
"query":{
"range":{
"age":{
"gte":25,
"lte":26
}
}
}
}
結果
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "秀儿",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
}
]
}
}
4.6 ページング、指定フィールドの出力、およびフィールドによるクエリのソート
例
POST /test_index02/_search
{
"query":{
"range":{
"age":{
"gte":25,
"lte":28
}
}
},
"from":0,
"size":2,
"_source":[
"name",
"age"
],
"sort":{
"age":"desc",
"sex":"desc"
}
}
結果
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "DNbg_IYBuSAClcwx4fEv",
"_score" : null,
"_source" : {
"name" : "李四",
"age" : 28
},
"sort" : [
28,
1
]
},
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "Ddbm_IYBuSAClcwxbfER",
"_score" : null,
"_source" : {
"name" : "王五",
"age" : 28
},
"sort" : [
28,
1
]
}
]
}
}
5.フィルタークエリの例
Filter的查询不会计算相关性分值,也不会对结果进行排序, 因此效率会高一点,查询的结果可以被缓存
例
POST /test_index02/_search
{
"query":{
"bool":{
"filter":{
"term":{
"age":25
}
}
}
}
}
結果
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.0,
"hits" : [
{
"_index" : "test_index02",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.0,
"_source" : {
"name" : "秀儿",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
}
]
}
}
6.match、term、match_phase、query_string总结
英単語の分割: スペースに従って個々の単語を分割します。
hello july を例として
、単語分割の最も細かい粒度が次の場合: hello, july. 最初のブログ (単語分割プロセス) にこの例があります。
- あいまい一致
一致の場合、フィールド名を指定する必要がありますが、入力クエリの内容はセグメント化されます。たとえば、「hello july」をクエリすると、まず単語がセグメント化され、hello と july の 2 つの部分に分割されます。 、インデックス ライブラリ内の対応する検索は、転置インデックスのルールに従って実行されます。フィールドに hello または july、または hello july が含まれている場合は、クエリが実行されます。 - term
term と match のクエリ結果が同じになることがあります。たとえば、term が 1 つの単語 july をクエリする場合、結果は match の結果と同じになります。term クエリはコンテンツを分割しません。つまり、july は分割されません。単語をより細かい部分に分割する。match を使用して July をクエリすると、match はクエリの内容をセグメント化しますが、 July はすでに最も粒度の細かいセグメント化になっており、その後、 July は転置インデックス クエリに使用されるため、2 つのクエリの結果は同じになります。
ただし、クエリ hello july が異なる場合、hello july は転置インデックス クエリ全体として使用され、単語は分割されませんが、一致は単語が分割されるため、クエリの結果は同じではなくなります。 - match_phase
match_phase はクエリの内容もセグメント化しますが、結果にはセグメント化された単語がすべて含まれている必要があり、その順序も同じである必要があります。クエリ「hello july」を例にとると、結果には hello と july が含まれている必要があり、それらは必ず含まれている必要があります。 「hello july」が最も細かい粒度でファジークエリを実行していることがわかります。また、「july hello」は、順序が正しくなく、クエリ条件を満たしていない場合は結果に表示されません。 - query_string
は match に似ていますが、match ではフィールド名を指定する必要があるのに対し、query_string はすべてのフィールドを検索します。
3. ドキュメントのマッピング
ElasticSearchのマッピングは動的マッピングと静的マッピングの2種類に分かれます。
1. 動的マッピング
リレーショナル データベース (mysql など) では、最初にデータベースとデータ テーブルを作成し、次にフィールドやフィールド タイプなどを定義し、最後にこのテーブルにデータを挿入する前にそれらを構成する必要があります。ElasticSearch では、マッピング (テーブル、フィールド、mysql のタイプなど) を定義する必要はありません。ドキュメントが ElasticSearch に書き込まれると、ドキュメントのフィールドに基づいてタイプが自動的に識別されます。このメカニズムはダイナミック マッピングと呼ばれます。
動的マッピングのルールは次のとおりです。
jsonデータ | オートマップタイプ |
---|---|
ヌル | フィールドは追加されていません |
正しいか間違っているか | ブール型 |
10進数 | フロート型 |
番号 | ロングタイプ |
日付 | 日付またはテキスト |
弦 | テキストタイプ |
配列 | 配列の最初の非 null 値によって決定されます |
jsonオブジェクト | オブジェクトタイプ |
2. 静的マッピング
ElasticSearch では、ドキュメントの各フィールド タイプ、単語セグメンターなどを含むマッピングを事前に定義することもできます。この方法は静的マッピングです。( 设置完的字段映射关系,是不支持修改的
)
3. ドキュメントマッピングを取得する
お問い合わせ
GET /test_index02/_mapping
結果
{
"test_index02" : {
"mappings" : {
"properties" : {
"address" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"age" : {
"type" : "long"
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"remark" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"sex" : {
"type" : "long"
}
}
}
}
}
静的マッピングの設定
"index":true
: このフィールドに対して単語分割インデックス作成を実行するかどうか
"store":true
: このフィールドに元のデータを保存するかどうか
PUT /test_index05
{
"mappings":{
"properties":{
"name":{
"type":"keyword",
"index":true,
"store":true
},
"sex":{
"type":"integer",
"index":true,
"store":true
},
"age":{
"type":"integer",
"index":true,
"store":true
},
"address":{
"type":"text",
"index":true,
"store":true
},
"remark":{
"type":"text",
"index":true,
"store":true
}
}
}
}
お問い合わせ
GET /test_index05/_mapping
結果
{
"test_index05" : {
"mappings" : {
"properties" : {
"address" : {
"type" : "text",
"store" : true
},
"age" : {
"type" : "integer",
"store" : true
},
"name" : {
"type" : "keyword",
"store" : true
},
"remark" : {
"type" : "text",
"store" : true
},
"sex" : {
"type" : "integer",
"store" : true
}
}
}
}
}
4. コアの種類
- 文字列: 文字列。文字列タイプにはテキストとキーワードが含まれます。
- text: このタイプは、長いテキストのインデックス付けに使用されます。インデックスを作成する前に、これらのテキストは単語に分割され、単語の組み合わせに変換され、インデックス付けされます。ES はこれらの単語を取得できます。テキスト タイプは並べ替えや集計には使用できません。 。
- キーワード: このタイプは分割できません。検索、フィルタリング、並べ替え、および集計に使用できます。キーワード タイプは、単語分割あいまい検索には使用できません。(つまり、データを「hello july」として保存した場合、それがテキスト型の場合、セグメント化されてインデックスに保存されますが、キーワードは、hello july 全体として直接インデックスに保存されます。それを分割します。)
- 数値型:long、integer、short、byte、double、float
- 日付の種類: 日付
- ブール型: ブール型
5.キーワードマッピングタイプとテキストマッピングタイプの違い
インデックス マッピング タイプ
名がkeyword( 只能精准查询, 不能分词查询,能聚合、排序
)になりました。
"mappings" : {
"properties" : {
"address" : {
"type" : "text",
"store" : true
},
"age" : {
"type" : "integer",
"store" : true
},
"name" : {
"type" : "keyword",
"store" : true
},
"remark" : {
"type" : "text",
"store" : true
},
"sex" : {
"type" : "integer",
"store" : true
}
}
}
}
}
すべてのデータにインデックスを付ける
"hits" : [
{
"_index" : "test_index05",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "天王盖地虎",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
}
]
用語クエリ
POST /test_index05/_search
{
"query":{
"term":{
"name":"天王盖地虎"
}
}
}
結果
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "test_index05",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.2876821,
"_source" : {
"name" : "天王盖地虎",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
}
]
}
}
照合クエリ
POST /test_index05/_search
{
"query":{
"match":{
"name":"地虎"
}
}
}
結果
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
}
}
这里需要注意一点:当name的type为keyword类型时,使用match进行搜索时,如果搜索内容和存贮内容完全一致,是可以搜到结果的。明明match会分词,为啥有能搜到呢?这个问题有些困扰到我。于是多方了解有了答案
以下をよくお読みください
① ElasticSearch のマッチクエリタイプをキーワードタイプのデータとして使用する場合、単語分割操作を行わずに直接完全一致クエリが実行されます。
②match を使用してテキスト型のデータをクエリする場合、単語の分割にはデフォルトで標準アナライザが使用され、クエリ文字列はクエリの前に分割されます。
③標準の単語セグメンターは、スペースや句読点などの区切り文字に従ってクエリ文字列を分割し、単語を小文字に変換し、一般的なストップワード (a、an、the など) を削除します。単語の分割後、ElasticSearch は逆インデックスのクエリ文字列で分割された各単語をクエリし、一致するドキュメントを返します。
クエリに他のワード ブレーカーを使用する必要がある場合は、一致クエリで対応するワード ブレーカーを指定できます。
たとえば、単語分割用のトークナイザーを指定します。
{
"query": {
"match": {
"content": {
"query": "天王盖地虎",
"analyzer": "ik_max_word"
}
}
}
}
インデックス構造
"name" : {
"type" : "keyword",
"store" : true
}
コンテンツのインデックス化
"hits" : [
{
"_index" : "test_index05",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "天王盖地虎",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
}
]
例
POST /test_index05/_search
{
"query":{
"match":{
"name":"天王盖地虎"
}
}
}
結果
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "test_index05",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.2876821,
"_source" : {
"name" : "天王盖地虎",
"sex" : 1,
"age" : 25,
"address" : "上海",
"remark" : "java"
}
}
]
}
}
6. 静的マッピングを作成するときにテキスト型の ik word セグメンタを指定します
名前フィールドを ik トークナイザーとして指定します
PUT /test_index05
{
"mappings":{
"properties":{
"name":{
"type":"keyword",
"index":true,
"store":true
},
"sex":{
"type":"integer",
"index":true,
"store":true
},
"age":{
"type":"integer",
"index":true,
"store":true
},
"address":{
"type":"text",
"index":true,
"store":true,
"analyzer":"ik_smart",
"search_analyzer":"ik_smart"
},
"remark":{
"type":"text",
"index":true,
"store":true
}
}
}
}
7. 既存のマッピングを変更する
簡単な方法:
①ニーズに合った新しい静的マッピングインデックスを作成します。
②古いインデックスデータを新しいインデックスに移行します
POST _reindex
{
"source":{
"index":"index_old"
},
"dest":{
"index":"index_new"
}
}
③ 関連するビジネス操作を実行するために引き続きインデックス名を使用したい場合は、エイリアスを変更し (オプション) 、新しいインデックスのエイリアスを、ここで使用されている古いインデックスの名前に設定する必要があります别名和索引一对一关系
。(エイリアスは複数のインデックスを指すことができます。これについては後で説明します)
PUT /index_new/_alias/index_old
次回は、社内でこのような問題が発生した場合の対処法について解説していきます。
8.Elasticsearch のオプティミスティック同時実行制御
-
悲観的な同時実行制御
このアプローチはリレーショナル データベースで広く使用されており、変更の競合が発生する可能性があることを前提としており、競合を防ぐためにリソースへのアクセスをブロックします。典型的な例は、データ行を読み取る前にデータ行をロックして、ロックを設定したスレッドのみがデータ行を変更できるようにすることです。
-
オプティミスティック同時実行制御
Elasticsearch で使用されるこのアプローチは、競合が不可能であることを前提としており、試行される操作はブロックされません。ただし、読み取りおよび書き込み中にソース データが変更された場合、更新は失敗します。次に、アプリケーションは競合を解決する方法を決定します。たとえば、新しいデータを使用して更新を再試行したり、ユーザーに報告したりできます。
ES新版本(7版本及以后版本)不使用version进行并发版本控制,使用 if_seq_no=版本值&if_primary_term=文档位置
新しいデータを追加する
PUT /test_index05/_doc/1
{
"name": "天王盖地虎",
"sex": 1,
"age": 25,
"address": "上海",
"remark": "java"
}
このデータ内容を更新する
POST /test_index05/_update/1
{
"doc":{
"name":"宝塔镇河妖"
}
}
結果
を再度更新しました
POST /test_index05/_update/1/?if_seq_no=1&if_primary_term=1
{
"doc":{
"name":"秀儿"
}
}
結果
同時実行性をシミュレートする
コマンドを再度実行する
POST /test_index05/_update/1/?if_seq_no=1&if_primary_term=1
{
"doc":{
"name":"秀儿"
}
}
結果