Elasticsearch 7一般的なクエリー(term、match、bool、filter)
7643 ワード
一、正確な検索term
termは完全な一致を表す、すなわち分詞器分析を行わず、ドキュメントに検索全体を含まなければならない語彙である.
1、term単値
フィールドに1つの値しかない場合はtermキーワードで検索
クエリbiz_id値19091900239021901225のレコード
さらにクエリーを最適化します.正確なクエリーなので、クエリーでスコア計算を行う必要はありません.ドキュメントを含めたり除外したりする計算だけを望んでいます.constant_を使用します.scoreクエリは、termクエリを非スコアモードで実行し、統合スコアとして1つを使用します.次のクエリを推奨
2、terms多値
フィールドに複数の値がある場合はtermsキーワードで検索し、配列に続く
constant_scoreは非採点モードでクエリーし、次のクエリーを推奨します.
3、term複数フィールド
二、マッチングクエリーmatch
matchとtermの違いは、matchクエリーの場合、elasticsearchは指定したフィールドに基づいて適切なアナライザを提供しますが、termクエリーにはアナライザ分析のプロセスはありません.matchクエリーはあいまいなマッチングに相当し、キーワードの一部だけを含んでいればいいです.
1、match
full text searchまたはexact value(stringフィールドまたはnot_analyzed以外のフィールド)を行い、一致させる
クエリーフィールドmerchant_idは2501の値であり、時間的に逆順である
2、match_all
{「match_all」:{}}はすべて一致し、クエリー条件が与えられない場合、デフォルトでは全検索されます.
3、multi_match
同時にクエリのキーワードに対して、複数のフィールドは同時にマッチングして、つまり複数のフィールドはANDの関係です
同時にfieldはより豊富なクエリーをサポートします
fieldsでは、brandName(ブランド名)、sortName(分類名)、productName(商品名)productKeyword(商品キーワード)を押して「デニム弾力」キーワードを検索し、brandNameソース値、ピンイン値、キーワード値ともに100点、sortNameソース値、ピンイン値80点、productNameソース値60点、productKeyword値20点、スコアの優先度が高い順に検索
4、match_phrase
match_phraseは分析テキストをクエリーし、分析テキストからフレーズクエリーを作成します.類似matchクエリー、match_phraseクエリーでは、まずクエリー文字列を単語リストに解析し、それらの単語を検索しますが、すべての検索単語が含まれ、検索単語と同じ場所にあるドキュメントのみが保持されます.
次のように、クエリーquick brown、quick brown fox、brown foxはクエリーできますが、quick foxはクエリーできません.
次のように、クエリーa,b,aとbの間に3文字おきにクエリーできます.クエリーが3文字未満ではありません.
三、boolクエリー
boolクエリには、must、should、must_の4つのオペレータが含まれています.not,query.これらはいずれも配列であり,配列の中には対応する判断条件がある.
must:andと等価に一致する必要があります.貢献採点
must_not:一致しない必要があります.notと等価で、よく句をフィルタしますが、スコアに貢献しません.
should:選択的マッチング、少なくとも1つを満たし、ORと等価である.貢献採点
filter:サブステートメントをフィルタし、一致する必要がありますが、スコアに寄与しません.
四、filterクエリー
フィルタは、結果をキャッシュするクエリーを行い、相関度は計算されず、スコアの計算を避け、実行速度が非常に速い.
以下、statusがactiveの状態であることを問い合わせる
filterはrange範囲クエリーと組み合わせてよく使用され、range範囲は組み合わせ可能なオプションです.
gt:より大きい
lt:より小さい
gte:以上
lte:以下
次のようにmerchant_をクエリーします.id値が2501の取引データ
次のクエリ、mustでマッチング、filterでフィルタリング、range定義範囲
五、よくあるクエリーシーン
1、照会業者IDは3582、注文番号は3600219903072618、時間範囲によってフィルタリングし、注文時間によって順序を逆さにし、毎回100条を照会する
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"
}]
}