Elasticsearch-共通オペレータ

8620 ワード

前回のブログでは、Elasticsearchのクエリー式を使用して簡単な検索方法を記録しました.次に、一般的なオペレータを記録します.

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%の場合、効果はoperatorandの場合に等しいと思います.boolshouldの組み合わせクエリーでは、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倍のスコアを得ることはできない.