Commits

Juan Carlos Picado Herrera committed 4bb9a36

Comments (0)

Files changed (22)

encuestame-business/src/main/java/org/encuestame/business/search/ReIndexAttachmentsJob.java

             log.debug("Initialize Index Starting...");
             this.indexerManager.initializeIndex();
         } catch (Exception e) {
-            log.fatal("Error al indexar "+e);
-            e.printStackTrace();
+            log.fatal("Index on reindex: "+e);
         }
     }
-}
+}

encuestame-business/src/main/java/org/encuestame/business/service/SearchService.java

 import org.apache.lucene.search.Searcher;
 import org.apache.lucene.search.TopScoreDocCollector;
 import org.apache.lucene.util.Version;
+import org.encuestame.business.search.GlobalSearchItem;
 import org.encuestame.business.service.imp.SearchServiceOperations;
 import org.encuestame.persistence.domain.survey.Poll;
 
  * @since February 09, 2011
  * @version $Id$
  */
-public class SearchService extends AbstractIndexService implements
-        SearchServiceOperations {
+public class SearchService extends AbstractIndexService implements SearchServiceOperations {
 
     public void indexDocument(final String indexDirPath,
             final String indexDirStore) throws IOException {
         return doc;
     }
 
+    public List<GlobalSearchItem> quickSearch(String keyword) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public List<GlobalSearchItem> quickSearch(String keyword, String language) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public List<GlobalSearchItem> globalKeywordSearch(String keyword,
+            String language) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public List<GlobalSearchItem> globalKeywordSearch(String keyword) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 
 }

encuestame-business/src/main/java/org/encuestame/business/service/imp/SearchServiceOperations.java

  */
 package org.encuestame.business.service.imp;
 
+import java.util.List;
+
+import org.encuestame.business.search.GlobalSearchItem;
+import org.encuestame.core.service.ServiceOperations;
+import org.encuestame.search.IndexerManager;
+
 /**
  * Search Service Operations.
  * @author Morales, Diana Paola paola AT encuestame.org
  * @since February 09, 2011
  */
-public interface SearchServiceOperations {
+public interface SearchServiceOperations extends ServiceOperations{
+
+
+    /**
+     * Quick search by keyword.
+     * @param keyword
+     * @return
+     */
+    List<GlobalSearchItem> quickSearch(final String  keyword);
+
+    /**
+     * Quick search based on language analyzer.
+     * @param keyword
+     * @param language
+     * @return
+     */
+    List<GlobalSearchItem> quickSearch(final String  keyword, final String language);
+
+    /**
+     *
+     * @param keyword
+     * @param language
+     * @return
+     */
+    List<GlobalSearchItem> globalKeywordSearch(final String  keyword, final String language);
+
+    /**
+     *
+     * @param keyword
+     * @return
+     */
+    List<GlobalSearchItem> globalKeywordSearch(final String  keyword);
+
 
 
 

encuestame-business/src/main/java/org/encuestame/business/setup/install/DatabaseInstall.java

         setDatabaseType(installDatabase);
         log.debug("Check Database Conection..");
         // verify database connection.
-        if (this.installerOperations.checkDatabaseConection() == 1) {
+        //if (this.installerOperations.checkDatabaseConection() == 1) {
+        if (Boolean.TRUE) {
             if (this.checkDatabase()) {
                 //get current version of database.
                 log.debug("Database is installed ... checking version");

encuestame-core/src/main/java/org/encuestame/core/cron/IndexRebuilder.java

 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.encuestame.persistence.domain.HashTag;
+import org.encuestame.persistence.domain.Project;
 import org.encuestame.persistence.domain.Question;
+import org.encuestame.persistence.domain.notifications.Notification;
+import org.encuestame.persistence.domain.security.SocialAccount;
+import org.encuestame.persistence.domain.security.UserAccount;
+import org.encuestame.persistence.domain.survey.PollFolder;
+import org.encuestame.persistence.domain.survey.SurveyFolder;
+import org.encuestame.persistence.domain.survey.TweetPollFolder;
 import org.encuestame.persistence.domain.survey.TweetPollResult;
+import org.encuestame.persistence.domain.survey.TweetPollSavedPublishedStatus;
 import org.hibernate.CacheMode;
 import org.hibernate.FlushMode;
 import org.hibernate.ScrollMode;
      * @throws Exception exception.
      */
     public void reindexEntities() throws Exception {
-        log.debug("reindexEntities");
-        FullTextSession fullTextSession = org.hibernate.search.Search.getFullTextSession(getHibernateTemplate().getSessionFactory().openSession());
-        //reindex(fullTextSession, Question.class);
+        log.debug("Starting domain reindex...");
+        long start = System.currentTimeMillis();
+        final FullTextSession fullTextSession = org.hibernate.search.Search.getFullTextSession(getHibernateTemplate().getSessionFactory().openSession());
+        reindex(fullTextSession, Question.class);
+        reindex(fullTextSession, UserAccount.class);
+        reindex(fullTextSession, TweetPollSavedPublishedStatus.class);
+        reindex(fullTextSession, TweetPollFolder.class);
+        reindex(fullTextSession, SurveyFolder.class);
+        reindex(fullTextSession, PollFolder.class);
+        //reindex(fullTextSession, Project.class);
+        reindex(fullTextSession, Notification.class);
+        reindex(fullTextSession, SocialAccount.class);
         reindex(fullTextSession, TweetPollResult.class);
         reindex(fullTextSession, HashTag.class);
         fullTextSession.close();
+        long end = System.currentTimeMillis();
+        log.debug("Indexing : took " + (end - start) + " milliseconds");
     }
 
     /**

encuestame-persistence/pom.xml

             <artifactId>hibernate-search</artifactId>
         </dependency>
         <dependency>
+           <groupId>org.apache.lucene</groupId>
+           <artifactId>lucene-snowball</artifactId>
+        </dependency>
+        <dependency>
             <groupId>jaxen</groupId>
             <artifactId>jaxen</artifactId>
         </dependency>

encuestame-persistence/src/main/java/org/encuestame/persistence/dao/imp/QuestionDaoImp.java

     }
 
     /**
-     * Retrieve Indexes Question By Keyword
-     * @param keyword
-     * @param userId
-     * @return
+     * Retrieve Indexes Question By Keyword.
+     * @param keyword keyword to search
+     * @param userId user id
+     * @return results list of questions
      */
     @SuppressWarnings("unchecked")
     public List<Question> retrieveIndexQuestionsByKeyword(final String keyword, final Long userId){
         log.info("keyword "+keyword);
         log.info("userId "+userId);
-        List<Question> searchResult = (List) getHibernateTemplate().execute(
+        @SuppressWarnings("rawtypes")
+        List<Question> searchResult = (List<Question>) getHibernateTemplate().execute(
                 new HibernateCallback() {
-                    @SuppressWarnings("deprecation")
                     public Object doInHibernate(org.hibernate.Session session) {
                         try {
                             final FullTextSession fullTextSession = Search.getFullTextSession(session);

encuestame-persistence/src/main/java/org/encuestame/persistence/domain/AbstractFolder.java

 import javax.persistence.TemporalType;
 
 import org.encuestame.persistence.domain.security.Account;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Store;
 
 @MappedSuperclass
 public abstract class AbstractFolder {
     /**
      * @return the folderName
      */
+    @Field(index = Index.TOKENIZED, store = Store.YES)
     @Column(name = "folderName", nullable = false)
     public String getFolderName() {
         return folderName;

encuestame-persistence/src/main/java/org/encuestame/persistence/domain/Project.java

 import org.encuestame.persistence.domain.security.Account;
 import org.encuestame.persistence.domain.security.UserAccount;
 import org.encuestame.persistence.domain.survey.SurveyGroup;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Store;
 
 /**
  * Project.
  */
 @Entity
 @Table(name = "project")
+@Indexed(index="Project")
 public class Project {
 
     private Long proyectId;
      * @return proyectId
      */
     @Id
+    @DocumentId
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Column(name = "project_id", unique = true, nullable = false)
     public Long getProyectId() {
     /**
      * @return projectDescription
      */
-    @Column(name = "description", length = 600)
+    @Field(index = Index.TOKENIZED)
+    @Column(name = "description", columnDefinition = "text", nullable = true)
     public String getProjectDescription() {
         return this.projectDescription;
     }
     /**
      * @return the projectName
      */
+    @Field(index = Index.TOKENIZED)
     @Column(name = "name", nullable = false)
     public String getProjectName() {
         return projectName;
      */
     @Column(name = "project_info")
     @Lob
+    @Field(index = Index.TOKENIZED)
     public String getProjectInfo() {
         return this.projectInfo;
     }
     /**
      * @param projectInfo projectInfo
      */
-    public void setProjectInfo(String projectInfo) {
+    public void setProjectInfo(final String projectInfo) {
         this.projectInfo = projectInfo;
     }
 
      * @return projectDateStart
      */
     @Temporal(TemporalType.TIMESTAMP)
+    @Field(index=Index.TOKENIZED, store=Store.YES)
     @Column(name = "date_start", nullable = false)
     public Date getProjectDateStart() {
         return this.projectDateStart;
      * @return projectDateFinish
      */
     @Temporal(TemporalType.TIMESTAMP)
+    @Field(index=Index.TOKENIZED, store=Store.YES)
     @Column(name = "date_finish", nullable = false)
     public Date getProjectDateFinish() {
         return this.projectDateFinish;

encuestame-persistence/src/main/java/org/encuestame/persistence/domain/admon/ParamConfiguration.java

-/*
- ************************************************************************************
- * Copyright (C) 2001-2010 encuestame: system online surveys Copyright (C) 2009
- * encuestame Development Team.
- * Licensed under the Apache Software License version 2.0
- * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
- * Unless required by applicable law or agreed to  in writing,  software  distributed
- * under the License is distributed  on  an  "AS IS"  BASIS,  WITHOUT  WARRANTIES  OR
- * CONDITIONS OF ANY KIND, either  express  or  implied.  See  the  License  for  the
- * specific language governing permissions and limitations under the License.
- ************************************************************************************
- */
-package org.encuestame.persistence.domain.admon;
-
-/**
- * Description Class.
- * @author Picado, Juan juanATencuestame.org
- * @since Jun 8, 2010 7:07:07 PM
- * @version Id: 
- */
-public class ParamConfiguration {
-
-}

encuestame-persistence/src/main/java/org/encuestame/persistence/domain/notifications/Notification.java

 import javax.persistence.TemporalType;
 
 import org.encuestame.persistence.domain.security.Account;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Store;
 
 /**
  * Notifications domain.
  */
 
 @Entity
+@Indexed(index="Notification")
 @Table(name = "notification")
 public class Notification {
 
      * @param notificationId
      *            the notificationId to set
      */
-    public void setNotificationId(Long notificationId) {
+    public void setNotificationId(final Long notificationId) {
         this.notificationId = notificationId;
     }
 
     /**
      * @return the description
      */
-
+    @Field(index=Index.TOKENIZED, store=Store.NO)
     @Column(name = "description", nullable = false)
     @Enumerated(EnumType.STRING)
     public NotificationEnum getDescription() {
      * @param description
      *            the description to set
      */
-    public void setDescription(NotificationEnum description) {
+    public void setDescription(final NotificationEnum description) {
         this.description = description;
     }
 
     }
 
     /**
-     * @param secUser
-     *            the secUser to set
+     * @param account account
      */
-    public void setAccount(Account account) {
+    public void setAccount(final Account account) {
         this.account = account;
     }
 
     /**
      * @param created the created to set
      */
-    public void setCreated(Date created) {
+    public void setCreated(final Date created) {
         this.created = created;
     }
 
     }
 
     /**
-     * @param rearded the rearded to set
+     * @param readed the rearded to set
      */
-    public void setReaded(Boolean readed) {
+    public void setReaded(final Boolean readed) {
         this.readed = readed;
     }
 
     /**
      * @return the additionalDescription
      */
+    @Field(index=Index.TOKENIZED, store=Store.NO)
     @Column(name = "additional_description", nullable = false)
     public String getAdditionalDescription() {
         return additionalDescription;
     /**
      * @param additionalDescription the additionalDescription to set
      */
-    public void setAdditionalDescription(String additionalDescription) {
+    public void setAdditionalDescription(final String additionalDescription) {
         this.additionalDescription = additionalDescription;
     }
-}
+}

encuestame-persistence/src/main/java/org/encuestame/persistence/domain/security/SocialAccount.java

 import javax.persistence.Table;
 
 import org.encuestame.persistence.domain.social.SocialProvider;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Store;
 
 /**
  * SecUser Twitter Acounts.
 
 @Entity
 @Table(name = "social_account")
+@Indexed(index="SocialAccount")
 public class SocialAccount {
 
     /**
      * @return the id
      */
     @Id
+    @DocumentId
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Column (name="sec_user_twitter_id", unique=true)
     public Long getId() {
     /**
      * @return the twitterAccount
      */
+    @Field(index = Index.TOKENIZED, store = Store.YES)
     @Column (name="social_account_name", nullable = false, unique = true)
     public String getSocialAccountName() {
         return socialAccountName;

encuestame-persistence/src/main/java/org/encuestame/persistence/domain/security/UserAccount.java

 import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
-import javax.persistence.FetchType;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.UniqueConstraint;
 
 import org.encuestame.persistence.domain.Project;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Store;
 
 /**
  * Security User Secondary.
 @Table(name = "userAccount",
        uniqueConstraints = {@UniqueConstraint(columnNames={"username", "email"})}
   )
+@Indexed(index="UserAccount")
 public class UserAccount {
 
     private Long uid;
      * @return uid
      */
     @Id
+    @DocumentId
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Column(name = "uid", unique = true, nullable = false)
     public Long getUid() {
     /**
      * @return completeName
      */
+    @Field(index = Index.TOKENIZED, store = Store.YES)
     @Column(name = "name", nullable = true, length = 50)
     public String getCompleteName() {
         return this.completeName;
     /**
      * @return userEmail userEmail
      */
+    @Field(index=Index.TOKENIZED, store=Store.YES)
     @org.hibernate.annotations.Index(name = "emailIndex")
     @Column(name = "email", unique = true, nullable = false, length = 150)
     public String getUserEmail() {
     /**
      * @return username
      */
+    @Field(index=Index.TOKENIZED, store=Store.YES)
     @org.hibernate.annotations.Index(name = "usernameIndex")
     @Column(name = "username", nullable = false, length = 30, unique = true)
     public String getUsername() {

encuestame-persistence/src/main/java/org/encuestame/persistence/domain/survey/PollFolder.java

 
 import org.encuestame.persistence.dao.IFolder;
 import org.encuestame.persistence.domain.AbstractFolder;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Indexed;
 
 /**
  * Polls Folder.
  */
 @Entity
 @Table(name = "poll_folder")
+@Indexed(index="PollFolder")
 public class PollFolder extends AbstractFolder implements IFolder{
      private Long id;
 
      * @return the pollFolderId
      */
      @Id
+     @DocumentId
      @GeneratedValue(strategy = GenerationType.AUTO)
      @Column(name = "pollFolderId", unique = true, nullable = true)
     public Long getId() {

encuestame-persistence/src/main/java/org/encuestame/persistence/domain/survey/QuestionAnswer.java

 import javax.persistence.Table;
 
 import org.encuestame.persistence.domain.Question;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Store;
 
 /**
  * QuestionsAnswers.
  */
 @Entity
 @Table(name = "questions_answers")
+
+@Indexed(index="QuestionAnswer")
 public class QuestionAnswer {
 
     /** questionAnswerId. **/
      * @return the questionAnswerId
      */
     @Id
+    @DocumentId
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Column(name = "q_answer_id", unique = true, nullable = false)
     public Long getQuestionAnswerId() {
     /**
      * @return the answer
      */
+    @Field(index = Index.TOKENIZED, store = Store.YES)
     @Column(name = "answer")
     public String getAnswer() {
         return answer;

encuestame-persistence/src/main/java/org/encuestame/persistence/domain/survey/SurveyFolder.java

 
 import org.encuestame.persistence.dao.IFolder;
 import org.encuestame.persistence.domain.AbstractFolder;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Indexed;
 
 
 /**
  */
 @Entity
 @Table(name = "survey_folder")
+@Indexed(index="SurveyFolder")
 public class SurveyFolder extends AbstractFolder implements IFolder {
 
     /****/
      * @return the surveyFolderId
      */
     @Id
+    @DocumentId
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Column(name = "survey_folderId", unique = true, nullable = false)
     public Long getId() {

encuestame-persistence/src/main/java/org/encuestame/persistence/domain/survey/TweetPollFolder.java

 
 import org.encuestame.persistence.dao.IFolder;
 import org.encuestame.persistence.domain.AbstractFolder;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Indexed;
 
 /**
  * Poll Domain.
 
 @Entity
 @Table(name = "tweetPoll_Folder")
+@Indexed(index="TweetPollFolder")
 public class TweetPollFolder extends AbstractFolder implements IFolder{
      private Long id;
 
      * @return the tweetPollFolderId
      */
      @Id
+     @DocumentId
      @GeneratedValue(strategy = GenerationType.AUTO)
      @Column(name = "tweetPollFolderId", unique = true, nullable = true)
     public Long getId() {
     public void  setId(Long id) {
         this.id = id;
     }
-
-
 }

encuestame-persistence/src/main/java/org/encuestame/persistence/domain/survey/TweetPollSavedPublishedStatus.java

 import javax.persistence.TemporalType;
 
 import org.encuestame.persistence.domain.security.SocialAccount;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Store;
 
 /**
  * TweetPoll Status Save Tweet Id.
  * @version $Id:$
  */
 @Entity
+@Indexed(index="TweetPollSavedPublishedStatus")
 @Table(name = "tweetPoll_save_published_status")
 public class TweetPollSavedPublishedStatus {
 
     /** {@link TweetPoll}. **/
     private TweetPoll tweetPoll;
 
+    /** Tweet Content. **/
+    private String tweetContent;
+
     /**. Tweet Id. **/
     private Long tweetId;
 
      * @return the id
      */
     @Id
+    @DocumentId
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Column(name = "status_save_poll_id", unique = true, nullable = false)
     public Long getId() {
     /**
      * @param tweetPoll the tweetPoll to set
      */
-    public void setTweetPoll(TweetPoll tweetPoll) {
+    public void setTweetPoll(final TweetPoll tweetPoll) {
         this.tweetPoll = tweetPoll;
     }
 
     public void setDescriptionStatus(String descriptionStatus) {
         this.descriptionStatus = descriptionStatus;
     }
+
+    /**
+     * @return the tweetContent
+     */
+    @Field(index=Index.TOKENIZED, store=Store.NO)
+    @Column(name = "tweet_content")
+    public String getTweetContent() {
+        return tweetContent;
+    }
+
+    /**
+     * @param tweetContent the tweetContent to set
+     */
+    public void setTweetContent(final String tweetContent) {
+        this.tweetContent = tweetContent;
+    }
 }

encuestame-search/src/main/java/org/encuestame/search/IndexerManager.java

     public int index(final File dataDir) throws Exception {
         log.debug("Index file is directory: " + dataDir.isDirectory());
         File[] files = dataDir.listFiles();
-        for (File f : files) {
-            if (!f.isDirectory() && !f.isHidden() && f.exists() && f.canRead()) {
-                indexFile(f); // Write documents in Index
+        int numberDocs = 0;
+        if ( files == null) {
+            log.info("No files in the directory ");
+        } else {
+            numberDocs = this.indexWriter.numDocs();
+            log.debug("List of files in the directory :"+numberDocs);
+            for (File f : files) {
+                if (!f.isDirectory() && !f.isHidden() && f.exists() && f.canRead()) {
+                    indexFile(f); // Write documents in Index
+                }
             }
         }
-        return this.indexWriter.numDocs();
+        return numberDocs;
     }
 
 
     public void close() throws IOException {
         this.indexWriter.close();
     }
-}
+}

encuestame-war/pom.xml

             <version>${jetty-plugin-version}</version>
         </dependency>
         <dependency>
-          <groupId>commons-dbcp</groupId>
-          <artifactId>commons-dbcp</artifactId>
+            <groupId>commons-dbcp</groupId>
+            <artifactId>commons-dbcp</artifactId>
         </dependency>
+        <dependency> 
+            <groupId>org.apache.lucene</groupId>
+            <artifactId>lucene-snowball</artifactId>
+        </dependency>                                          
     </dependencies>
 
     <repositories>

encuestame-war/src/main/webapp/WEB-INF/spring/encuestame-quartz-context.xml

                  <!--  Reindex domains -->
                  <bean id="cronReindex" class="org.springframework.scheduling.quartz.CronTriggerBean">
                     <property name="jobDetail" ref="reindexingInvokingJobDetail" />
-                    <property name="cronExpression" value="0 0/15 * * * ?" />
+                    <property name="cronExpression" value="0 0/1 * * * ?" />
                     <!-- Every 5 minutes 0 0/5 * * * ? -->
                     <!-- 0 0 12 1/5 * ? Fire at 12pm (noon) every 5 days every month, starting on the first day of the month. -->
                 </bean>
                 <!-- Reindex attachments -->
                 <bean id="attachmentsReindex" class="org.springframework.scheduling.quartz.CronTriggerBean">
                     <property name="jobDetail" ref="reindexingAttachmentsJobDetail" />
-                    <property name="cronExpression" value="0 0/1 * * * ?" />
+                    <property name="cronExpression" value="0 0/3 * * * ?" />
                     <!-- Every 5 minutes 0 0/5 * * * ? -->
                     <!-- 0 0 12 1/5 * ? Fire at 12pm (noon) every 5 days every month, starting on the first day of the month. -->
                 </bean>
            <groupId>org.apache.lucene</groupId>
     	   <artifactId>lucene-fast-vector-highlighter</artifactId>
     	   <version>${lucene.version}</version>
-       </dependency>
-       <dependency>
+        </dependency>
+        <dependency>
     	   <groupId>org.apache.lucene</groupId>
     	   <artifactId>lucene-spellchecker</artifactId>
     	   <version>${lucene.version}</version>
-      </dependency>
+        </dependency>
+        <dependency>
+           <groupId>org.apache.lucene</groupId>
+           <artifactId>lucene-snowball</artifactId>
+           <version>${lucene.version}</version>
+        </dependency>
         <!-- Apache Tiles -->
         <dependency>
             <groupId>org.apache.tiles</groupId>
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.