Elasticsearch 基本的な検索クエリ操作

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

クエリ操作

基本型

$ curl -XGET 'http://localhost:9200/<インデックス名>/_search'

パラメータ指定 (Query String)

$ curl -XGET 'http://localhost:9200/<インデックス名>/_search?q=<フィールド名>:<検索ワード>'

クエリDSL

$ curl -XGET 'http://localhost:9200/<インデックス名>/_search'  -H 'Content-Type: application/json' -d '<クエリDSL>'

DSLシンタックス

{
  "query": {<クエリ内容>},
  "from": 0,
  "size": 10,
  "sort": [<検索結果のソート指定>],
  "_source": [<検索結果として返すフィールド名>]
}
  • query クエリ内容とするJSONオブジェクト
  • from / size 所謂、offset/limit。 default 0/10


全文検索クエリ


match_all

総scan

{
  "query": {
    "match_all": {}
  }
}


match

フィールド名:検索ワードで指定。検索ワードは空白で区切ることで「OR」検索となる。

{
  "query": {
    "match": {
      "message": "Elasticsearch world"
    }
  }
}

また、operatorを指定することで「AND」で検索することもできる。

{
  "query": {
    "match": {
      "message": {
        "query": "Elasticsearch world",
        "operator": "and"
      } 
    }
  }
}

N個以上のキーワードが含まれる。という指定

{
  "query": {
    "match": {
      "message": {
        "query": "Elasticsearch world",
        "minimum_should_match": 2
      } 
    }
  }
}


match_phrase

matchに指定した語順の並び順までをチェックする

{
  "query": {
    "match_phrase": {
      "message": "Elasticsearch world"
    }
  }
}


Termクエリ (完全一致)

keywordフィールドに対して使用する。

{
  "query": {
    "term": {
      "user_name": "John Smith"
    }
  }
}


Termsクエリ いずれかが完全一致するか?の検索
{
  "query": {
    "terms": {
      "user_name": ["John Smith", "Terry Man"]
    }
  }
}


Rangeクエリ

日付型や数値型の範囲検索を行う。

{
  "query": {
    "range": {
      "date": {
        "gte": "2017-10-14T15:09:45",
        "lte": "2017-10-16T15:09:45"
      }
    }
  }
}

date型はシステム日付と日付計算式が使用できる。

  • now
  • y 年
  • M 月
  • w 週
  • d 日
  • h 時
  • m 分
  • s 秒

一週間前までのデータを検索

{
  "query": {
    "range": {
      "date": {
        "gte": "now-1w"
      }
    }
  }
}


boolクエリ

  • must すべての式を満たす必要がある
  • should いずれかの式、またはminimum_should_match数のを満たす必要がある。
  • must_not この式を満たすドキュメントは除外する
  • filter スコアに関係なく式に一致したドキュメントを返す 検索範囲を限定したり、スコアが必要ないクエリであれば高速に動作する
{
  "query": {
    "bool": {
      "must":[
        {"match": {"message": "elasticsearch"} },
        {"term": {"user_name": "John Smith"} }
      ],
      "should":[
        {"match": {"message": "world"} },
        {"term": {"user_name": "Terry man"} }
      ],
      "must_not": [
        {"match": {"message": "Haskell"} }
      ]
    }
  }
}


sort

{
  "query": {
    "match_all": {}
  },
  "sort": [
    { "date": {"order": "desc"} },
    "_score"
  ]
}

配列は集約結果でsortすることができる

{
  "query": {
    "match_all": {}
  },
  "sort": [
    { "dayoff": {"order": "desc", "mode": "avg"} }
  ]
}
  • avg
  • min
  • max
  • sum
  • median