@Override public Set<NameEntry> listByAlphabet(String alphabetQuery) { return nameEntryRepository.findByNameStartingWithAndState(alphabetQuery, State.PUBLISHED); }
@Override public Set<String> autocomplete(String query) { Set<NameEntry> names = new LinkedHashSet<>(); Set<String> nameToReturn = new LinkedHashSet<>(); // TODO calling the db in a for loop might not be a terribly good idea. Revist for (int i=2; i<query.length() + 1; i++) { String searchTerm = query.substring(0, i); names.addAll(nameEntryRepository.findByNameStartingWithAndState(searchTerm, State.PUBLISHED)); } Set<NameEntry> otherParts = nameEntryRepository.findNameEntryByNameContainingAndState(query, State.PUBLISHED); names.addAll(otherParts); names.forEach(name -> { nameToReturn.add(name.getName()); }); return nameToReturn; }
@Override public Set<NameEntry> search(String searchTerm) { Set<NameEntry> possibleFound = new LinkedHashSet<>(); /** * The following approach should be taken: * * 1. First do a exact search. If found return result. If not go to 2. * 2. Do a search with ascii-folding. If found return result, if not go to 3 * 3. Do a prefix search. If found, return result, if not go to 4 * 4. Do a search based on partial match. Irrespective of outcome, proceed to 4 * 4a - Using nGram? * 4b - ? * 5. Do a full text search against other variants. Irrespective of outcome, proceed to 6 * 6. Do a full text search against meaning. Irrespective of outcome, proceed to 7 * 7. Do a full text search against extendedMeaning */ NameEntry exactFound = nameEntryRepository.findByNameAndState(searchTerm, State.PUBLISHED); if (exactFound != null) { return Collections.singleton(exactFound); } Set<NameEntry> startingWithSearchTerm = nameEntryRepository.findByNameStartingWithAndState(searchTerm, State.PUBLISHED); if (startingWithSearchTerm != null && startingWithSearchTerm.size() > 0) { return startingWithSearchTerm; } possibleFound.addAll(nameEntryRepository.findNameEntryByNameContainingAndState(searchTerm, State.PUBLISHED)); possibleFound.addAll(nameEntryRepository.findNameEntryByVariantsContainingAndState(searchTerm, State.PUBLISHED)); possibleFound.addAll(nameEntryRepository.findNameEntryByMeaningContainingAndState(searchTerm, State.PUBLISHED)); possibleFound.addAll(nameEntryRepository.findNameEntryByExtendedMeaningContainingAndState(searchTerm, State.PUBLISHED)); return possibleFound; }