diff --git a/src/main/java/uk/ac/cam/cl/dtg/segue/dao/content/GitContentManager.java b/src/main/java/uk/ac/cam/cl/dtg/segue/dao/content/GitContentManager.java index 7b5907dce0..c4d3df652e 100644 --- a/src/main/java/uk/ac/cam/cl/dtg/segue/dao/content/GitContentManager.java +++ b/src/main/java/uk/ac/cam/cl/dtg/segue/dao/content/GitContentManager.java @@ -349,9 +349,20 @@ public final ResultsWrapper siteWideSearch( // Restrict content types .includeContentTypes(contentTypes) + // High priority matches on untokenised search string + .searchFor(new SearchInField(Constants.ID_FIELDNAME + "." + + Constants.UNPROCESSED_SEARCH_FIELD_SUFFIX, Collections.singleton(searchString)) + .priority(Priority.HIGH).strategy(Strategy.SIMPLE)) + .searchFor(new SearchInField(Constants.TITLE_FIELDNAME + "." + + Constants.UNPROCESSED_SEARCH_FIELD_SUFFIX, Collections.singleton(searchString)) + .priority(Priority.HIGH).strategy(Strategy.SIMPLE)) + .searchFor(new SearchInField(Constants.SUBTITLE_FIELDNAME + "." + + Constants.UNPROCESSED_SEARCH_FIELD_SUFFIX, Collections.singleton(searchString)) + .priority(Priority.HIGH).strategy(Strategy.SIMPLE)) + // Fuzzy search term matches .searchFor(new SearchInField(Constants.ID_FIELDNAME, searchTerms) - .priority(Priority.HIGH).strategy(Strategy.FUZZY)) + .priority(Priority.HIGH).strategy(Strategy.DEFAULT)) .searchFor(new SearchInField(Constants.TITLE_FIELDNAME, searchTerms) .priority(Priority.HIGH).strategy(Strategy.FUZZY)) .searchFor(new SearchInField(Constants.SUBTITLE_FIELDNAME, searchTerms) @@ -360,10 +371,8 @@ public final ResultsWrapper siteWideSearch( .priority(Priority.HIGH).strategy(Strategy.FUZZY)) .searchFor(new SearchInField(Constants.TAGS_FIELDNAME, searchTerms) .priority(Priority.HIGH).strategy(Strategy.FUZZY)) - .searchFor(new SearchInField(Constants.PRIORITISED_SEARCHABLE_CONTENT_FIELDNAME, searchTerms) - .priority(Priority.HIGH).strategy(Strategy.FUZZY)) - .searchFor(new SearchInField(Constants.SEARCHABLE_CONTENT_FIELDNAME, searchTerms) - .strategy(Strategy.FUZZY)) + .searchFor(new SearchInField(Constants.PRIORITISED_SEARCHABLE_CONTENT_FIELDNAME, searchTerms)) + .searchFor(new SearchInField(Constants.SEARCHABLE_CONTENT_FIELDNAME, searchTerms)) // Event specific queries .searchFor(new SearchInField(Constants.ADDRESS_PSEUDO_FIELDNAME, searchTerms)) @@ -450,10 +459,22 @@ public final ResultsWrapper questionSearch( .priority(Priority.HIGH).strategy(Strategy.SUBSTRING)) .searchFor(new SearchInField(Constants.TAGS_FIELDNAME, searchTerms) .priority(Priority.HIGH).strategy(Strategy.SUBSTRING)) - .searchFor(new SearchInField(Constants.PRIORITISED_SEARCHABLE_CONTENT_FIELDNAME, searchTerms) - .priority(Priority.HIGH).strategy(Strategy.SUBSTRING)) - .searchFor(new SearchInField(Constants.SEARCHABLE_CONTENT_FIELDNAME, searchTerms) - .strategy(Strategy.SUBSTRING)); + .searchFor(new SearchInField(Constants.PRIORITISED_SEARCHABLE_CONTENT_FIELDNAME, searchTerms)) + .searchFor(new SearchInField(Constants.SEARCHABLE_CONTENT_FIELDNAME, searchTerms)); + + if (searchString != null && !searchString.isBlank()) { + // High priority matches on untokenised search string + searchInstructionBuilder + .searchFor(new SearchInField(Constants.ID_FIELDNAME + "." + + Constants.UNPROCESSED_SEARCH_FIELD_SUFFIX, Collections.singleton(searchString)) + .priority(Priority.HIGH).strategy(Strategy.SIMPLE)) + .searchFor(new SearchInField(Constants.TITLE_FIELDNAME + "." + + Constants.UNPROCESSED_SEARCH_FIELD_SUFFIX, Collections.singleton(searchString)) + .priority(Priority.HIGH).strategy(Strategy.SIMPLE)) + .searchFor(new SearchInField(Constants.SUBTITLE_FIELDNAME + "." + + Constants.UNPROCESSED_SEARCH_FIELD_SUFFIX, Collections.singleton(searchString)) + .priority(Priority.HIGH).strategy(Strategy.SIMPLE)); + } // FIXME: Make this and PageFacade agnostic // It doesn't need to know about books, just have required tags diff --git a/src/main/java/uk/ac/cam/cl/dtg/segue/etl/ElasticSearchIndexer.java b/src/main/java/uk/ac/cam/cl/dtg/segue/etl/ElasticSearchIndexer.java index 41838d5cd1..96ce5be527 100644 --- a/src/main/java/uk/ac/cam/cl/dtg/segue/etl/ElasticSearchIndexer.java +++ b/src/main/java/uk/ac/cam/cl/dtg/segue/etl/ElasticSearchIndexer.java @@ -58,7 +58,7 @@ class ElasticSearchIndexer extends ElasticSearchProvider { @Inject public ElasticSearchIndexer(RestHighLevelClient searchClient) { super(searchClient); - rawFieldsListByType.put("content", Lists.newArrayList("id", "title")); + rawFieldsListByType.put("content", Lists.newArrayList("id", "title", "subtitle")); rawFieldsListByType.put("school", Lists.newArrayList("urn")); nestedFieldsByType.put("content", Lists.newArrayList("audience")); } diff --git a/src/main/java/uk/ac/cam/cl/dtg/segue/search/IsaacSearchInstructionBuilder.java b/src/main/java/uk/ac/cam/cl/dtg/segue/search/IsaacSearchInstructionBuilder.java index cfac04729c..22fa58f6ef 100644 --- a/src/main/java/uk/ac/cam/cl/dtg/segue/search/IsaacSearchInstructionBuilder.java +++ b/src/main/java/uk/ac/cam/cl/dtg/segue/search/IsaacSearchInstructionBuilder.java @@ -50,14 +50,16 @@ public class IsaacSearchInstructionBuilder { private static final float PRIORITY_CONTENT_BOOST = 5L; private List searchesInFields; - public static final Long NO_BOOST = 1L; + private static final Long NO_BOOST = 1L; private static final Long FIELD_BOOST = 5L; private static final Long FIELD_BOOST_FUZZY = 1L; private static final Long WILDCARD_FIELD_BOOST = 1L; private static final Long HIGH_PRIORITY_FIELD_BOOST = 10L; - private static final Long HIGH_PRIORITY_FIELD_BOOST_FUZZY = 3L; - private static final Long HIGH_PRIORITY_WILDCARD_FIELD_BOOST = 2L; + private static final Long HIGH_PRIORITY_FIELD_BOOST_FUZZY = 8L; + private static final Long HIGH_PRIORITY_WILDCARD_FIELD_BOOST = 5L; + + private static final Long SEARCHABLE_CONTENT_FIELD_BOOST = 2L; private static final Long EVENT_ADDRESS_FIELD_BOOST = 3L; private static final Long EVENT_ADDRESS_FIELD_BOOST_FUZZY = 1L; @@ -345,8 +347,13 @@ private void addSearchesInFieldsToInstruction(final BooleanInstruction instructi } else { // Generic fields + boolean isSearchableContentField = searchInField.getField().equals(Constants.SEARCHABLE_CONTENT_FIELDNAME) || + searchInField.getField().equals(Constants.PRIORITISED_SEARCHABLE_CONTENT_FIELDNAME); for (String term : searchInField.getTerms()) { - if (searchInField.getStrategy() == Strategy.DEFAULT) { + if (isSearchableContentField) { + generatedSubInstructions.add(new MatchInstruction(searchInField.getField(), term, + SEARCHABLE_CONTENT_FIELD_BOOST, true)); + } else if (searchInField.getStrategy() == Strategy.DEFAULT) { Long boost = searchInField.getPriority() == Priority.HIGH ? HIGH_PRIORITY_FIELD_BOOST : FIELD_BOOST; Long fuzzyBoost = searchInField.getPriority() == Priority.HIGH @@ -359,7 +366,7 @@ private void addSearchesInFieldsToInstruction(final BooleanInstruction instructi } else if (searchInField.getStrategy() == Strategy.SUBSTRING) { Long boost = searchInField.getPriority() == Priority.HIGH - ? HIGH_PRIORITY_FIELD_BOOST : FIELD_BOOST; + ? HIGH_PRIORITY_WILDCARD_FIELD_BOOST : WILDCARD_FIELD_BOOST; generatedSubInstructions.add( new MatchInstruction(searchInField.getField(), term, boost, false)); @@ -368,16 +375,16 @@ private void addSearchesInFieldsToInstruction(final BooleanInstruction instructi } else if (searchInField.getStrategy() == Strategy.FUZZY) { Long boost = searchInField.getPriority() == Priority.HIGH - ? HIGH_PRIORITY_WILDCARD_FIELD_BOOST : WILDCARD_FIELD_BOOST; + ? HIGH_PRIORITY_WILDCARD_FIELD_BOOST : WILDCARD_FIELD_BOOST; generatedSubInstructions.add(new MatchInstruction(searchInField.getField(), term, boost, true)); - generatedSubInstructions.add( - new WildcardInstruction(searchInField.getField(), "*" + term + "*", boost)); - // Use a multi-match instruction, and ensure multi-match instructions for a particular term are - // grouped together + generatedSubInstructions.add(new WildcardInstruction(searchInField.getField(), "*" + term + "*", boost)); + + // Use a multi-match instruction, and ensure multi-match instructions for a + // particular term are grouped together multiMatchSearchesGroupedByTerm.putIfAbsent(term, Sets.newHashSet()); multiMatchSearchesGroupedByTerm.get(term).add(searchInField.getField()); - + } else if (searchInField.getStrategy() == Strategy.SIMPLE) { Long boost = searchInField.getPriority() == Priority.HIGH ? HIGH_PRIORITY_FIELD_BOOST : NO_BOOST;