DataMapperを教えておじいさん | Selfkleptomaniacに回答しようとしたら、既に解決されていた・・・。

require 'rubygems'
require 'dm-core'
require 'dm-migrations'

class Repo
  include DataMapper::Resource
  property :id, Serial
  property :body, String
end

DataMapper.logger.set_log STDERR, :debug, "SQL: ", true
DataMapper.setup(:default, 'sqlite::memory:')
Repo.auto_migrate!                                                                                                                                                

puts Repo.all(:body.like => '%hoge%') |
     Repo.all(:body.like => '%fuga%') |
     Repo.all(:body.like => '%piyo%')

結果:

SQL: (0.000045) SELECT sqlite_version(*)
SQL: (0.000082) DROP TABLE IF EXISTS "repos"
SQL: (0.000014) PRAGMA table_info("repos")
SQL: (0.000393) CREATE TABLE "repos" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "body" VARCHAR(50))
SQL: (0.000079) SELECT "id", "body" FROM "repos" WHERE ("body" LIKE '%piyo%' OR "body" LIKE '%hoge%' OR "body" LIKE '%fuga%') ORDER BY "id"

検索条件の場合、分かりやすく書くとこういう感じでしょうか。検索条件の論理演算がRubyの演算子で出来るのが面白いですね。しかし恐ろしく遅そうなSQLが。

Lokkaでもしちゃんと検索をやるならばLuceneのRuby版であるFerretdm-ferret-adapterで使うのが楽そうです。datamapperのadapterになってるということはindexの置き場所も何でもいいというフリーダムさ。検索式を解析するFerret::QueryParserが日本語対応してるかわからないので面倒かもしれません。