Add Metadata to search results and facets - RepoCamp/ohsu2018 GitHub Wiki
Metadata Part 3 Goals:
Setup
(OPTIONAL) Save your current changes
If you have changes in your current branch -- you can check on this via git status
-- you'll want to save those before starting this lesson (which uses a separate branch):
git checkout -b wip_lesson_7_start
git add .
git commit -m 'checkpoint before beginning third metadata lesson'
Check out working branch
git checkout lesson_7_start
NOTE: If you make experimental changes and want to get back to the minimal code state necessary to run this lesson, you can check the starting code out again using:
git checkout lesson_7_start
Add field to search results
One of the requirements of our ticket is to add our new metadata field to the search results screen.
Write a feature spec for our search
You might be able to guess by now, the first thing we'll do is write a feature spec.
- Create
spec/features/search_work_spec.rb
require 'rails_helper'
RSpec.feature 'Search for a work' do
let(:title) { ['Journey to Skull Island'] }
let(:creator) { ['Quest, Jane'] }
let(:keyword) { ['Pirates', 'Adventure'] }
let(:visibility) { Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC }
let(:year) { ['1492'] }
let(:work) do
Work.new(title: title,
creator: creator,
keyword: keyword,
visibility: visibility,
year: year)
end
context 'general search' do
before do
work.save
end
scenario "Search for a work" do
visit("/")
fill_in "q", with: "Journey"
click_button "Go"
# Uncomment this to display the HTML capybara is seeing
# puts page.body
expect(page).to have_content work.title.first
expect(page).to have_content work.creator.first
expect(page).to have_content work.keyword.first
end
end
end
- Run your test suite. Everything should pass. This feature spec describes the search functionality as it currently exists.
- Edit
search_work_spec.rb
and add a line to check for your new metadata field, like this:
expect(page).to have_content work.year.first
- Run your test suite again. That test should now fail with the message
Failure/Error: expect(page).to have_content work.year.first
Add our metadata field to Blacklight config
Because our search behavior is inherited from Blacklight, in order to change what fields are being displayed in the search results, we have to update the application's Blacklight config.
- Edit
app/controllers/catalog_controller.rb
and look for the section includingadd_index_field
statements. Add the following:
config.add_index_field solr_name("year", :stored_searchable), label: "Year"
- Run your test suite again, and your search feature should now pass.
Make a field facetable
Edit the search feature spec
This time, we're not just going to look for whether our year
field shows up in the search results, we're going to make it a facetable field, and make it appear in the left hand facets menu.
- Add these lines to the end of your search feature spec:
expect(page).to have_xpath("//h3", text: "Creator")
expect(page).to have_link(work.creator.first, class: "facet_select")
- Run your test suite (
rails ci
). Everything should pass. These lines describe functionality that already exists on your search results page. - Now add a test for new behavior that doesn't exist yet:
expect(page).to have_xpath("//h3", text: "Year")
expect(page).to have_link(work.year.first, class: "facet_select")
- Run your test suite again and your search feature will fail
Index the metadata field as facetable
- Edit
app/models/work.rb
. Change the wayyear
is indexed to include:facetable
:
property :year, predicate: "http://www.europeana.eu/schemas/edm/year" do |index|
index.as :stored_searchable, :facetable
end
- Edit
app/controllers/catalog_controller.rb
and around line 46 add this line, right under the Creator facet:
config.add_facet_field solr_name("year", :facetable), label: "Year", limit: 5
- Run your test suite again and it should pass.
Note: You can see the changes we made in this section on github.
Pair exercise
We made one field into a facet. Choose either extent or references and add a second metadata field. Or, define your own metadata field, as long as you pick something that can be a simple string.