Elasticsearch-共通オペレータ
8620 ワード
前回のブログでは、Elasticsearchのクエリー式を使用して簡単な検索方法を記録しました.次に、一般的なオペレータを記録します.
通常、
クエリーされたデータは、
上記のコードでは、
全文検索を行う場合、たとえば、
次のデータが得られます.
結果データから、検索条件から見ると、2つのnameを含むデータは、それぞれ1つしか満たされていない.本来、彼らの
operator
match
クエリはまた、パラメータとしてoperator
オペレータを受け入れることができ、デフォルトではor
である.次に、and
に変更し、すべてが一致するようにします.{
"query":{
"match":{
"name":{
"query":" ",
"operator":"and"
}
}
}
}
通常、
match
で中国語または英語の文を検索すると、Elasticsearchはそれを分詞します.たとえば、
を検索すると、
と
のデータが検索される可能性があります.operator
オペレータをand
に変更すると、name
に
を含む関連データが検索されます.クエリーされたデータは、
と
がつながっていない可能性があることに注意してください.minmum_should_match
match
クエリは、文書が関連しているかどうかを示すために一致する必要がある単語の数を指定するminimum_should_match
最小一致パラメータもサポートします.特定の数値に設定できます.通常はパーセントに設定します.{
"query":{
"match":{
"name":{
"query":" ",
"minmum_should_match":"50%"
}
}
}
}
上記のコードでは、
minmum_should_match
は50%であり、
または
に一致しなければならないデータを示している.このとき、minmum_should_match
が100%の場合、効果はoperator
がand
の場合に等しいと思います.bool
とshould
の組み合わせクエリーでは、minmum_should_match
を使用して、クエリーの精度を次のように設定することもできます.{
"query":{
"bool":{
"should":[
{"match":{"addr":" "}},
{"match":{"age":18}},
{"match":{"name":" "}}
],
"minmun_should_match":2
}
}
}
minmum_should_match
ここでの役割はshouldが最小に満たす条件を2つ制御することである.boost
全文検索を行う場合、たとえば、
Hello
またはWorld
のすべてのデータを含むことを望んでいますが、検索されたデータは、World
を含むデータが先頭に並ぶことを望んでいます.この場合、boost
オペレータを使用して、クエリー文の重みを高めることができます.curl -XGET 'http://localhost:9200/pycharm/python/_search' -d '
{
"query":{
"bool":{
"should":[
{
"match":{
"name":"Hello"
}
},
{
"match":{
"name":{
"query":"World",
"boost":2
}
}
}
]
}
}
}
'
次のデータが得られます.
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.51623213,
"hits": [
{
"_index": "pycharm",
"_type": "python",
"_id": "AV_sGprjgqXX572f9WJP",
"_score": 0.51623213,
"_source": {
"name": "Python World"
}
},
{
"_index": "pycharm",
"_type": "python",
"_id": "AV_sGmPDgqXX572f9WJO",
"_score": 0.25811607,
"_source": {
"name": "Hello EveryBody"
}
}
]
}
}
結果データから、検索条件から見ると、2つのnameを含むデータは、それぞれ1つしか満たされていない.本来、彼らの
_score
の値は同じであるべきであるが、結果から見ると、Python
を含むnameデータ_score
の値は、Hello
を含むnameデータ_score
の値の2倍近くであることがわかる.これは、クエリ文の重みを高めたためである.関連するクエリは、より高い_score
値を取得します.デフォルトのクエリー文の重みは1です.重みを低減し、boost
の値を0から1の間にすることができる.重みを上げて、boost
の値を1より大きくすればよい.しかし、このような上昇または低下は線形ではなく、言い換えれば、boost
の値が2であれば、_score
の2倍のスコアを得ることはできない.