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検索かけるよりましかなー。
