Elasticsearchで AND OR LIKE 検索したい

2014-03-27

Elasticsearchでクエリ書くときにちょっとわかりづらかったので、メモ

例えば、SQLだとこういう検索をしたい

SELECT * FROM table WHERE (body = 'わーい' OR body = 'ろくでなし' )
   AND create_at >= '2014-03-01' AND create_at <= '2014-04-01';

これをelasticsearchのqueryだとこう

 


{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "body": "わーい"
                }
              },
              {
                "range": {
                  "create_at": {
                    "from": "2014-03-01",
                    "to": "2014-04-01"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "body": "ろくでなし"
                }
              },
              {
                "range": {
                  "create_at": {
                    "from": "2014-03-01",
                    "to": "2014-04-01"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

shouldがor検索で、mustがand検索

上の書き方だと、or句が増えるたびにcreate_atを全部同じの書かないといけないからもうちょっとマシな書き方がありそうな気がする

elasticsearchでもLIKE検索

elasticsearchにもLIKE検索あります。

{
    "query": {
        "bool": {
                "must": [{
                        "wildcard": {
                             "body": "*お肉*"
                        }
                }]
        }
    }
}

wildcardで、「*」が使えます。

インデックス使われないので、term検索より重たいです。

でもMySQLでLIKE検索かけるよりましかなー。