🙆‍♀️

ElasticsearchのQueryの書き方

2024/09/19に公開

ElasticsearchのQueryの書き方

  • 概念
    • Document

      • Elasticsearchの中に保存されるJSONオブジェクト(databaseのtableの行)
    • Index

      • 関連性を持つJSONオブジェクトのグループ(databaseのTable)

Queryの書き方

  • フォーマット
GET INDEX_NAME/_search
{
  "query": {
    query_clauses
  }
}
  • query_clauses

    • match

      • 単語のマッチング、headlineのフィールドで三つの単語Shape of youの任意が出る場合はマッチングと思うわれる
        GET headlines/_search
        {
          "query": {
            "match": {
              "headline": "Shape of you"
            }
          }
        }
        
      • "operator": "and" 或いは "minimum_should_match": 2を追加して、任意の単語のマッチングではなく、全ての単語のマッチング或いは2個以上の単語のマッチングができる
        GET headlines/_search
        {
          "query": {
            "match": {
              "headline": "Shape of you"
              "operator": "and"
            }
          }
        }
        
    • multi-match

      • 複数のフィールドで単語party, planningの任意のマッチング / phraseのマッチング("type": "phrase")
        • ^2のような書き方でフィールドのWeightの指定が可能、headlineのフィールドでparty, planningが出ると、他のフィールドで出るより、検索の結果のもっと前に並べる
        GET headlines/_search
        {
          "query": {
            "multi_match": {
              "query": "party planning",
              "fields": ["headline^2","short_description", "authors"],
              "type": "phrase"
            }
          }
        }
        
    • match_phrase

      • フレーズのマッチング、headlineのフィールドで Shape of youを全て、同じ順で、連続で出ると、マッチングと思うわれる
        • マッチングである
          • XXX shape of you XXX
          • XXX shape, of you XXX
        • マッチングではない
          • XXX Shape of XXX you XXX
        GET headlines/_search
        {
          "query": {
            "match_phrase": {
              "headline": "Shape of you"
            }
          }
        }
        
    • bool query

      • bool queryを使って、以上のquery clausesを組み合わせることができる
      • フォーマット
      GET headlines/_search
      {
        "query": {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "Harry Potter",
                  "fields": ["headline^2","short_description", "authors"]
                }
              }
            ],
            "must_not": [
              {
                "match": {
                  "category": "WEIRD NEWS"
                }
              }
            ],
            "should": [
              {
                "match": {
                  "category": "ARTS & CULTURE"
                }
              },
              {
                "match_phrase": {
                  "category": "ENTERTAINMENT"
                }
              }
            ],
            "filter": [
              {
                "range": {
                  "date": {
                    "gte": "2014-03-25",
                    "lte": "2016-03-25"
                  }
                }
              }
            ]
          }
        },
        "size": 200
      }
      
      • must
        • 全てをマッチングする(AND)、Scoreに影響がある
      • should
        • 任意をマッチングする(OR)、Scoreに影響がある
      • filter
        • 全てをマッチングする(AND)、Scoreに影響なし
      • must_not
        • 全てをマッチングしない
  • Paging(ページング)

    • sizefromを指定する、SQLのlimitoffsetに似てる
    GET headlines/_search
    {
      "query": {
        "multi_match": {
          "query": "party planning",
          "fields": ["headline^2","short_description", "authors"],
          "type": "phrase"
        }
      },
      "size": 2,
      "from": 2,
      "track_total_hits": true
    }
    

Discussion