Advertisement
Guest User

Hibernate Search

a guest
Apr 3rd, 2017
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.12 KB | None | 0 0
  1. @Indexed(index = "HospitalIndex")
  2. @AnalyzerDefs({
  3.         @AnalyzerDef(name = "ngram",
  4.                 tokenizer = @TokenizerDef(factory = WhitespaceTokenizerFactory.class),
  5.                 filters = {
  6.                         @TokenFilterDef(factory = StandardFilterFactory.class),
  7.                         @TokenFilterDef(factory = LowerCaseFilterFactory.class),
  8.                         @TokenFilterDef(factory = EdgeNGramFilterFactory.class,
  9.                                 params = {
  10.                                         @Parameter(name = "minGramSize", value = "1"),
  11.                                         @Parameter(name = "maxGramSize", value = "40")}),
  12.                 }),
  13.         @AnalyzerDef(name = "search",
  14.                 tokenizer = @TokenizerDef(factory = WhitespaceTokenizerFactory.class),
  15.                 filters = {
  16.                         @TokenFilterDef(factory = StandardFilterFactory.class),
  17.                         @TokenFilterDef(factory = LowerCaseFilterFactory.class),
  18.                 })
  19. })
  20. public class Hospital {
  21.    
  22.         @Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO, analyzer = @Analyzer(definition = "ngram"))
  23.         private String name = "";
  24.        
  25.         @Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO, analyzer = @Analyzer(definition = "ngram"))
  26.         private String shortname = "";
  27.        
  28.         @IndexedEmbedded
  29.         private Set<MobileGroup> mobileGroups;
  30.  
  31. }
  32.  
  33. @Indexed(index = "MobileGroupIndex")
  34. public class MobileGroup {
  35.     @Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO, analyzer = @Analyzer(definition = "ngram"))
  36.         private String name = "";
  37.        
  38.         @Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO, analyzer = @Analyzer(definition = "ngram"))
  39.         private String shortname = "";
  40. }
  41.  
  42. // search functions
  43.  
  44. public List<Hospital> findHospital(String searchString) {
  45.     // Define search paths
  46.     List<List<String>> searchPaths = new ArrayList<>();
  47.     searchPaths.add(Arrays.asList("name", "shortname"));
  48.     searchPaths.add(Arrays.asList("wards.name", "wards.shortname"));
  49.     searchPaths.add(Arrays.asList("mobileGroups.name", "mobileGroups.shortname"));
  50.     searchPaths.add(Arrays.asList("mobileGroups.mobileDevices.name"));
  51.     searchPaths.add(Arrays.asList("wards.rooms.name", "wards.rooms.shortname"));
  52.     searchPaths.add(Arrays.asList("wards.rooms.bedPlaces.name", "wards.rooms.bedPlaces.shortname"));
  53.     searchPaths.add(Arrays.asList("wards.rooms.bedPlaces.communicationDevice.name"));
  54.     searchPaths.add(Arrays.asList("mobileGroups.mobileDevices.communicationDevice.name"));
  55.     searchPaths.add(Arrays.asList("wards.rooms.bedPlaces.communicationDevice.infusionDeviceRuntimeInfos.infusionDevice.identNumber.serialnumber"));
  56.     searchPaths.add(Arrays.asList("wards.rooms.bedPlaces.communicationDevice.identNumber.serialnumber"));
  57.     searchPaths.add(Arrays.asList("mobileGroups.mobileDevices.communicationDevice.identNumber.serialnumber"));
  58.     searchPaths.add(Arrays.asList("mobileGroups.mobileDevices.communicationDevice.infusionDeviceRuntimeInfos.infusionDevice.identNumber.serialnumber"));
  59.  
  60.     return search(searchString, Hospital.class, searchPaths).collect(Collectors.toList());
  61. }
  62.  
  63. @SuppressWarnings("unchecked")
  64. private <T> Stream<T> search(String searchString, Class<T> entity, List<List<String>> searchPaths) {
  65.     //check if searchString is empty
  66.     if (searchString == null || searchString.isEmpty()) {
  67.         return Stream.empty();
  68.     }
  69.  
  70.     boolean exactSearch = false;
  71.     if (searchString.matches("^\".*\"$")) {
  72.         exactSearch = true;
  73.         searchString = searchString.substring(1, searchString.length() - 1);
  74.     } else if (searchString.contains("\"")) {
  75.         return Stream.empty();
  76.     }
  77.  
  78.     // create native Lucene query unsing the query DSL
  79.     QueryBuilder qb = buildQueryBuilder(entity);
  80.  
  81.     // search for hospitals, care units, mobile groups, rooms, beds, mobile devices and communication devices
  82.     List<Query> queries;
  83.     if (exactSearch) {
  84.         queries = buildPhraseQueries(qb, searchString, searchPaths);
  85.     } else {
  86.         queries = buildKeywordQueries(qb, searchString, searchPaths);
  87.     }
  88.  
  89.     Query query = buildConnectedShouldBoolQuery(queries, qb);
  90.  
  91.     // wrap Lucene query in a javax.persistence.Query
  92.     javax.persistence.Query persistenceQuery = fullTextEntityManager.createFullTextQuery(query, entity);
  93.     // execute search
  94.     return persistenceQuery.getResultList().stream();
  95. }
  96.  
  97. private QueryBuilder buildQueryBuilder(Class<?> entity) {
  98.     return fullTextEntityManager
  99.     .getSearchFactory()
  100.     .buildQueryBuilder()
  101.     .forEntity(entity)
  102.     .overridesForField("name", "search")
  103.     .overridesForField("shortname", "search")
  104.     .overridesForField("mobileGroups.mobileDevices.communicationDevice.identNumber.serialnumber", "search")
  105.     .overridesForField("mobileGroups.mobileDevices.communicationDevice.infusionDeviceRuntimeInfos.infusionDevice.identNumber.serialnumber", "search")
  106.     .overridesForField("mobileGroups.mobileDevices.communicationDevice.name", "search")
  107.     .overridesForField("mobileGroups.mobileDevices.name", "search")
  108.     .overridesForField("mobileGroups.name", "search")
  109.     .overridesForField("mobileGroups.shortname", "search")
  110.     .overridesForField("mobileDevices.communicationDevice.identNumber.serialnumber", "search")
  111.     .overridesForField("mobileDevices.communicationDevice.infusionDeviceRuntimeInfos.infusionDevice.identNumber.serialnumber", "search")
  112.     .overridesForField("mobileDevices.communicationDevice.name", "search")
  113.     .overridesForField("mobileDevices.name", "search")
  114.     .overridesForField("wards.name", "search")
  115.     .overridesForField("wards.rooms.bedPlaces.communicationDevice.identNumber.serialnumber", "search")
  116.     .overridesForField("wards.rooms.bedPlaces.communicationDevice.infusionDeviceRuntimeInfos.infusionDevice.identNumber.serialnumber", "search")
  117.     .overridesForField("wards.rooms.bedPlaces.communicationDevice.name", "search")
  118.     .overridesForField("wards.rooms.bedPlaces.name", "search")
  119.     .overridesForField("wards.rooms.bedPlaces.shortname", "search")
  120.     .overridesForField("wards.rooms.name", "search")
  121.     .overridesForField("wards.rooms.shortname", "search")
  122.     .overridesForField("wards.shortname", "search")
  123.     .overridesForField("rooms.bedPlaces.communicationDevice.identNumber.serialnumber", "search")
  124.     .overridesForField("rooms.bedPlaces.communicationDevice.infusionDeviceRuntimeInfos.infusionDevice.identNumber.serialnumber", "search")
  125.     .overridesForField("rooms.bedPlaces.communicationDevice.name", "search")
  126.     .overridesForField("rooms.bedPlaces.name", "search")
  127.     .overridesForField("rooms.bedPlaces.shortname", "search")
  128.     .overridesForField("rooms.name", "search")
  129.     .overridesForField("rooms.shortname", "search")
  130.     .overridesForField("communicationDevice.identNumber.serialnumber", "search")
  131.     .overridesForField("communicationDevice.infusionDeviceRuntimeInfos.infusionDevice.identNumber.serialnumber", "search")
  132.     .overridesForField("communicationDevice.name", "search")
  133.     .overridesForField("bedPlaces.communicationDevice.identNumber.serialnumber", "search")
  134.     .overridesForField("bedPlaces.communicationDevice.infusionDeviceRuntimeInfos.infusionDevice.identNumber.serialnumber", "search")
  135.     .overridesForField("bedPlaces.communicationDevice.name", "search")
  136.     .overridesForField("bedPlaces.name", "search")
  137.     .overridesForField("bedPlaces.shortname", "search")
  138.     .overridesForField("infusionDeviceRuntimeInfos.infusionDevice.identNumber.serialnumber", "search")
  139.     .overridesForField("identNumber.serialnumber", "search")
  140.     .get();
  141. }
  142.  
  143. private static List<Query> buildKeywordQueries(QueryBuilder qb, String keyword, List<List<String>> fieldsList) {
  144.     if (keyword == null || keyword.isEmpty()) {
  145.         return null;
  146.     } else if (fieldsList == null || fieldsList.isEmpty()) {
  147.         return null;
  148.     }
  149.     List<Query> queries = new ArrayList<Query>();
  150.     for (List<String> fields : fieldsList) {
  151.         String[] fieldsArray = fields.toArray(new String[fields.size()]);
  152.         queries.add(buildKeywordQuery(qb, keyword, fieldsArray));
  153.     }
  154.     return queries;
  155. }
  156.  
  157. private static List<Query> buildPhraseQueries(QueryBuilder qb, String phrase, List<List<String>> fieldsList) {
  158.     if (phrase == null || phrase.isEmpty()) {
  159.         return null;
  160.     } else if (fieldsList == null || fieldsList.isEmpty()) {
  161.         return null;
  162.     }
  163.     List<Query> queries = new ArrayList<Query>();
  164.     for (List<String> fields : fieldsList) {
  165.         String[] fieldsArray = fields.toArray(new String[fields.size()]);
  166.         queries.add(buildPhraseQuery(qb, phrase, fieldsArray));
  167.     }
  168.     return queries;
  169. }
  170.  
  171.  
  172. private static Query buildKeywordQuery(QueryBuilder qb, String keyword, String[] fields) {
  173.     if (keyword == null || keyword.isEmpty()) {
  174.         return null;
  175.     }
  176.     return qb.keyword().onFields(fields).matching(keyword).createQuery();
  177. }
  178.  
  179. private static Query buildPhraseQuery(QueryBuilder qb, String phrase, String[] fields) {
  180.     if (phrase == null || phrase.isEmpty() || fields.length == 0) {
  181.         return null;
  182.     }
  183.     Query query = qb.phrase().onField(fields[0]).ignoreAnalyzer().sentence(phrase).createQuery();
  184.     for (int i = 1; i < fields.length - 1; i++) {
  185.         Query tmp = qb.phrase().onField(fields[i]).ignoreAnalyzer().sentence(phrase).createQuery();
  186.         query = qb.bool().should(query).should(tmp).createQuery();
  187.     }
  188.     return query;
  189. }
  190.  
  191. private static Query buildConnectedShouldBoolQuery(List<Query> queries, QueryBuilder qb) {
  192.     if (queries.isEmpty()) {
  193.         return null;
  194.     }
  195.     Query booleanQuery = qb.bool().should(queries.get(0)).createQuery();
  196.     for (int i = 1; i < queries.size(); i++) {
  197.         booleanQuery = qb.bool().should(booleanQuery).should(queries.get(i)).createQuery();
  198.     }
  199.     return booleanQuery;
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement