##はじめに
自作のポータルサイトにタグ検索を実装したので、復習しておきます。
http://nishikanako.work
##方法
下記のソースのように、スクレイピングしてきたurlのタイトルと説明文の中に、選択しているキーワードがあれば、抜き出してテーブルにデータの中に保存。
tag_keyword = ["あおい", "さくら", "きいろいゾウ", "通天閣", "しずく", "こうふく みどりの", "こうふく あかの", "窓の魚", "映画", "i", "イベント", "うつくしい人", "きりこについて", "炎上する君", "白いしるし", "円卓", "漁港の肉子ちゃん", "地下の鳩", "ふくわらい", "インタビュー", "サイン会", "ふる", "舞台", "サラバ", "まく子", "おまじない", "イベント", "劇場", "上映", "まにまに" ,"ご飯ぐるり", "作家", "小説家", "Youtube", "対談"]
tag_keyword.each do |keyword|
if (title+description).index(keyword) != nil then
scrape_tag = ScrapeTag.create(
:tag => keyword,
:scrape_id => scrape.id
)
p '[Tag] ' + keyword
end
end
indexメソッドは、配列から引数objと同じ要素を探し、その位置を整数で返します(1番目が0、2番目が1、...)。要素が見つからないときは、nilを返します。
https://ref.xaio.jp/ruby/classes/array/index
とのこと。
上のソースを文章で整理すると、キーワードの存在性を一つ一つ検証する。ここで、タイトルと概要文のなかにキーワードがあれば(nilでなければ)、そのキーワードを該当するurlに紐づけて(scrape.id)、データとして保存する。二つのテーブルの紐付けは belongs_to
と has_many
を利用した。
これを記事の概要文の下に表示。
<% scrape.scrape_tags.each do |tag| %>
#bootstrap
<span class="badge badge-lg badge-primary ">
<a href="/?keyword=<%= tag.tag %>" style="color:white"><%= tag.tag %></a>
</span>
<% end %>
下の青のボックスの中に入った単語がタグとして表示される。
aタグでリンクにしているので、タグをクリックすればそのタグがついた記事がだけが表示されるようになる。
上記のようにするには、contorollerの方で記事の集合体のインスタンス変数(@scrapes)を条件に分けて定義する必要がある。
def home
if params[:keyword].present?
@scrapes = Scrape.where("title LIKE ? or description LIKE ?","%"+params[:keyword]+"%","%"+params[:keyword]+"%").paginate(page: params[:page],:per_page => 21).includes(:scrape_tags)
else
@scrapes = Scrape.paginate(page: params[:page],:per_page => 21).includes(:scrape_tags)
end
end
paramsでキーワードの存在性を確認して、ない場合は全ての記事を取得、ある場合はタイトルか概要文にキーワードが含まれている記事だけを取得するようにしている。
##終わりに
今回,mecabを利用しようと思いましたが、例えば名詞だけを抜き取ろうとしたところ、あまり有用性のある単語がなかったので、indexメソッドを利用しました。
解説不足なところがありましたら、コメントよろしくお願いします♪( ´▽`)