Skip to content

Commit a383514

Browse files
authored
Merge pull request #933 from MITLibraries/timx-588-fulltext-search
Allows searching the fulltext field when requested
2 parents 0f9ea3f + ae73a6b commit a383514

File tree

3 files changed

+37
-6
lines changed

3 files changed

+37
-6
lines changed

app/graphql/types/query_type.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ def record_id(id:, index:)
5454
argument :title, String, required: false, default_value: nil, description: 'Search by title'
5555
argument :from, String, required: false, default_value: '0',
5656
description: 'Search result number to begin with (the first result is 0)'
57+
argument :fulltext, Boolean, required: false, default_value: false,
58+
description: 'Include fulltext field in search? Defaults to false.'
5759
argument :index, String, required: false, default_value: nil,
5860
description: 'It is not recommended to provide an index value unless we have provided ' \
5961
'you with one for your specific use case'
@@ -99,11 +101,11 @@ def record_id(id:, index:)
99101
end
100102

101103
def search(searchterm:, citation:, contributors:, funding_information:, geodistance:, geobox:, identifiers:,
102-
locations:, subjects:, title:, index:, source:, from:, boolean_type:, **filters)
104+
locations:, subjects:, title:, index:, source:, from:, boolean_type:, fulltext:, **filters)
103105
query = construct_query(searchterm, citation, contributors, funding_information, geodistance, geobox, identifiers,
104106
locations, subjects, title, source, boolean_type, filters)
105107

106-
results = Opensearch.new.search(from, query, Timdex::OSClient, highlight_requested?, index)
108+
results = Opensearch.new.search(from, query, Timdex::OSClient, highlight_requested?, index, fulltext)
107109

108110
response = {}
109111
response[:hits] = results['hits']['total']['value']

app/models/opensearch.rb

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@ class Opensearch
44
SIZE = 20
55
MAX_PAGE = 200
66

7-
def search(from, params, client, highlight = false, index = nil)
7+
def search(from, params, client, highlight = false, index = nil, fulltext = false)
88
@params = params
99
@highlight = highlight
10+
@fulltext = fulltext?(fulltext)
1011
index = default_index unless index.present?
1112
client.search(index:,
1213
body: build_query(from))
1314
end
1415

16+
# Only treat fulltext as true if it is boolean true or the string 'true' (case insensitive)
17+
def fulltext?(fulltext_param)
18+
fulltext_param == true || fulltext_param.to_s.downcase == 'true'
19+
end
20+
1521
def default_index
1622
ENV.fetch('OPENSEARCH_INDEX', nil)
1723
end
@@ -132,15 +138,23 @@ def minimum_should_match
132138
end
133139
end
134140

141+
# Fields to be searched in multi_match query. Adds 'fulltext' field if fulltext search is enabled.
142+
def fields_to_search
143+
fields = ['alternate_titles', 'call_numbers', 'citation', 'contents', 'contributors.value', 'dates.value',
144+
'edition', 'funding_information.*', 'identifiers.value', 'languages', 'locations.value',
145+
'notes.value', 'numbering', 'publication_information', 'subjects.value', 'summary', 'title']
146+
fields << 'fulltext' if @fulltext
147+
148+
fields
149+
end
150+
135151
def matches
136152
m = []
137153
if @params[:q].present?
138154
m << {
139155
multi_match: {
140156
query: @params[:q].downcase,
141-
fields: ['alternate_titles', 'call_numbers', 'citation', 'contents', 'contributors.value', 'dates.value',
142-
'edition', 'funding_information.*', 'identifiers.value', 'languages', 'locations.value',
143-
'notes.value', 'numbering', 'publication_information', 'subjects.value', 'summary', 'title'],
157+
fields: fields_to_search,
144158
minimum_should_match:
145159
}
146160
}

test/models/opensearch_test.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,21 @@ class OpensearchTest < ActiveSupport::TestCase
8686
end
8787
end
8888

89+
test 'fulltext is included when requested' do
90+
os = Opensearch.new
91+
os.instance_variable_set(:@params, { q: 'this' })
92+
os.instance_variable_set(:@fulltext, true)
93+
94+
assert(os.matches.to_json.include?('"fields":["alternate_titles","call_numbers","citation","contents","contributors.value","dates.value","edition","funding_information.*","identifiers.value","languages","locations.value","notes.value","numbering","publication_information","subjects.value","summary","title","fulltext"]'))
95+
end
96+
97+
test 'fulltext is not included by default' do
98+
os = Opensearch.new
99+
os.instance_variable_set(:@params, { q: 'this' })
100+
101+
assert(os.matches.to_json.include?('"fields":["alternate_titles","call_numbers","citation","contents","contributors.value","dates.value","edition","funding_information.*","identifiers.value","languages","locations.value","notes.value","numbering","publication_information","subjects.value","summary","title"]'))
102+
end
103+
89104
test 'searches a single field' do
90105
VCR.use_cassette('opensearch single field') do
91106
params = { title: 'spice it up' }

0 commit comments

Comments
 (0)