Elasticsearch 7一般的なクエリー(term、match、bool、filter)

7643 ワード

一、正確な検索term
termは完全な一致を表す、すなわち分詞器分析を行わず、ドキュメントに検索全体を含まなければならない語彙である.
1、term単値
フィールドに1つの値しかない場合はtermキーワードで検索
クエリbiz_id値19091900239021901225のレコード
curl -XGET http://192.168.1.73:9200/xyerp/order/_search -H 'Content-Type: application/json' -d '
{
 "query": {
     "term": {
       "biz_id": "1909190023901225"
      }
 }
}

さらにクエリーを最適化します.正確なクエリーなので、クエリーでスコア計算を行う必要はありません.ドキュメントを含めたり除外したりする計算だけを望んでいます.constant_を使用します.scoreクエリは、termクエリを非スコアモードで実行し、統合スコアとして1つを使用します.次のクエリを推奨
{  
    "query" : {  
        "constant_score" : {  
             "filter" : {  
                "term" : {  
                    "biz_id" : "1909190023901225"  
                }  
            }  
        }  
    }  
}'

2、terms多値
フィールドに複数の値がある場合はtermsキーワードで検索し、配列に続く
{
    "query":{
        "terms":{
            "biz_id":["1909190023901225"]
        }
    }
}'

 constant_scoreは非採点モードでクエリーし、次のクエリーを推奨します.
{  
    "query" : {  
        "constant_score" : {  
             "filter" : {  
                "terms" : {  
                    "biz_id" : ["1909190023901225","e1909190111365113"]  
                }  
            }  
        }  
    }  
}'

3、term複数フィールド
{
	"query": [{
		"term": {
			"biz_id": "1909190023901225"
		}
	}, {
		"term": {
			"name": "zhangsan"
		}
	}]
}

二、マッチングクエリーmatch
matchとtermの違いは、matchクエリーの場合、elasticsearchは指定したフィールドに基づいて適切なアナライザを提供しますが、termクエリーにはアナライザ分析のプロセスはありません.matchクエリーはあいまいなマッチングに相当し、キーワードの一部だけを含んでいればいいです.
1、match
full text searchまたはexact value(stringフィールドまたはnot_analyzed以外のフィールド)を行い、一致させる
クエリーフィールドmerchant_idは2501の値であり、時間的に逆順である
{
   "query": {
     "match": {
       "merchant_id": "2501"
     }
   },
   "sort": [
     {
       "trade_finished_time": {
         "order": "desc"
       }
     }
   ]
}'

2、match_all
{「match_all」:{}}はすべて一致し、クエリー条件が与えられない場合、デフォルトでは全検索されます.
{
	"query": {
		"match_all": {}
	}
}

3、multi_match
同時にクエリのキーワードに対して、複数のフィールドは同時にマッチングして、つまり複数のフィールドはANDの関係です
{
    "query":{
        "multi_match":{
            "query":"2501",
            "fields":["merchant_id","_id"]
        }
    }
}

同時にfieldはより豊富なクエリーをサポートします
fieldsでは、brandName(ブランド名)、sortName(分類名)、productName(商品名)productKeyword(商品キーワード)を押して「デニム弾力」キーワードを検索し、brandNameソース値、ピンイン値、キーワード値ともに100点、sortNameソース値、ピンイン値80点、productNameソース値60点、productKeyword値20点、スコアの優先度が高い順に検索
{
  "query": {
    "multi_match": {
      "query": "     ",
      "fields": [
        "brandName^100",
        "brandName.brandName_pinyin^100",
        "brandName.brandName_keyword^100",
        "sortName^80",
        "sortName.sortName_pinyin^80",
        "productName^60",
        "productKeyword^20"
      ],
      "type": ,
      "operator": "AND"
    }
  }
}

4、match_phrase
 match_phraseは分析テキストをクエリーし、分析テキストからフレーズクエリーを作成します.類似matchクエリー、match_phraseクエリーでは、まずクエリー文字列を単語リストに解析し、それらの単語を検索しますが、すべての検索単語が含まれ、検索単語と同じ場所にあるドキュメントのみが保持されます.
次のように、クエリーquick brown、quick brown fox、brown foxはクエリーできますが、quick foxはクエリーできません.
{  
      "query": {  
          "match_phrase": {  
              "title": "quick brown fox"  
          }  
      }  
}  

次のように、クエリーa,b,aとbの間に3文字おきにクエリーできます.クエリーが3文字未満ではありません.
{
    "query":{
        "match_phrase" :{
            "query":"a,b",
            "slop":3
        }
    }
}

三、boolクエリー
boolクエリには、must、should、must_の4つのオペレータが含まれています.not,query.これらはいずれも配列であり,配列の中には対応する判断条件がある.
must:andと等価に一致する必要があります.貢献採点
must_not:一致しない必要があります.notと等価で、よく句をフィルタしますが、スコアに貢献しません.
should:選択的マッチング、少なくとも1つを満たし、ORと等価である.貢献採点
filter:サブステートメントをフィルタし、一致する必要がありますが、スコアに寄与しません.
{  
    "query" : {  
        "filtered" : {  
            "filter" : {  
                "bool" : {  
                    "should" : [  
                        { "term" : {"merchant_id" : 100}},  
                        { "term" : {"pay_type" : "3"}}  
                    ],  
                    "must_not" : {  
                        "term" : {"trade_type" : "2"}  
                    }  
                }  
            }  
        }  
    }  
}'

四、filterクエリー
フィルタは、結果をキャッシュするクエリーを行い、相関度は計算されず、スコアの計算を避け、実行速度が非常に速い.
以下、statusがactiveの状態であることを問い合わせる
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

filterはrange範囲クエリーと組み合わせてよく使用され、range範囲は組み合わせ可能なオプションです.
gt:より大きい
lt:より小さい
gte:以上
lte:以下
次のようにmerchant_をクエリーします.id値が2501の取引データ
{
  "query": {
    "bool": {
      "must": {
        "term": {
          "merchant_id": "2501"
        }
      }, 
      "filter": {
        "range": {
          "trade_finished_time": {
            "from": "2019-09-01T00:00:00", 
            "to": "2019-09-30T23:59:59"
          }
        }
      }
    }
  }
}

次のクエリ、mustでマッチング、filterでフィルタリング、range定義範囲
{    
    "query": {    
        "bool": {    
            "must": [    
                {   
                    "match": {   
                        "title": "Search"   
                        }  
                },  
                {   
                    "match": {   
                    "content": "Elasticsearch"   
                    }  
                }  
            ],    
            "filter": [  
                {   
                    "term": {   
                        "status": "1"   
                        }  
                },  
                {   
                    "range": {   
                        "publish_date": {   
                        "gte": "2015-01-01"   
                        }  
                    }  
                }  
            ]  
        }  
     }  
}  

五、よくあるクエリーシーン
1、照会業者IDは3582、注文番号は3600219903072618、時間範囲によってフィルタリングし、注文時間によって順序を逆さにし、毎回100条を照会する
{
	"query": {
		"bool": {
			"must": [{
				"term": {
					"merchant_id": "3582"
				}
			}, {
				"term": {
					"order_num": "360102199003072618"
				}
			}],
			"filter": [{
				"range": {
					"order_time": {
						"from": "2019-11-01T17:00:00+08:00",
						"to": "2019-11-01T20:00:00+08:00"
					}
				}
			}]
		}
	},
	"size": 100,
	"sort": [{
		"order_time": "desc"
	}]
}