2012-05-08 2 views
0
@AnalyzerDef(
     name = "tags", 
     tokenizer = 
      @TokenizerDef(factory = PatternTokenizerFactory.class, 
       params = { 
        @Parameter(name = "pattern", value=",") 
       } 
      ), 
     filters = { 
      @TokenFilterDef(factory = StandardFilterFactory.class), 
      @TokenFilterDef(factory = LowerCaseFilterFactory.class), 
      @TokenFilterDef(
       factory = StopFilterFactory.class, 
       params = { 
        @Parameter(name = "words", value = "data/ignorewords.txt"), 
        @Parameter(name = "ignoreCase", value = "true") 
       } 
      ), 
      @TokenFilterDef(
       factory = SynonymFilterFactory.class, 
       params = { 
        @Parameter(name = "ignoreCase", value="true"), 
        @Parameter(name = "expand", value="false"), 
        @Parameter(name = "synonyms", value="data/synonyms.txt") 
       } 
      ), 
      @TokenFilterDef(
       factory = SnowballPorterFilterFactory.class, 
       params = { 
        @Parameter(name = "language", value="English") 
       } 
      ), 
      @TokenFilterDef(
       factory = ShingleFilterFactory.class, 
       params = { 
        @Parameter(name = "minShingleSize", value="2"), 
        @Parameter(name = "maxShingleSize", value="3"), 
        @Parameter(name = "outputUnigrams", value="true"), 
        @Parameter(name = "outputUnigramsIfNoShingles", value="false") 
       } 
      ), 
      @TokenFilterDef(
       factory = PositionFilterFactory.class, 
       params = { 
        @Parameter(name = "positionIncrement", value = "100") 
       } 
      ), 
      @TokenFilterDef(
       factory = PhoneticFilterFactory.class, 
       params = { 
        @Parameter(name = "encoder", value="RefinedSoundex"), 
        @Parameter(name = "inject", value="true") 
       } 
      ) 
     } 
), 
@AnalyzerDef(
    name = "querytime", 
    tokenizer = 
     @TokenizerDef(factory = StandardTokenizerFactory.class), 
    filters = { 
     @TokenFilterDef(factory = StandardFilterFactory.class), 
     @TokenFilterDef(factory = LowerCaseFilterFactory.class), 
     @TokenFilterDef(factory = StopFilterFactory.class, 
      params = { 
       @Parameter(name = "words", value = "data/ignorewords.txt"), 
       @Parameter(name = "ignoreCase", value = "true") 
      } 
     ), 
     @TokenFilterDef(
      factory = SnowballPorterFilterFactory.class, 
      params = { 
       @Parameter(name = "language", value="English") 
      } 
     ), 
     @TokenFilterDef(
      factory = ShingleFilterFactory.class, 
      params = { 
       @Parameter(name = "minShingleSize", value="2"), 
       @Parameter(name = "maxShingleSize", value="3"), 
       @Parameter(name = "outputUnigrams", value="true"), 
       @Parameter(name = "outputUnigramsIfNoShingles", value="false") 
      } 
     ), 
     @TokenFilterDef(
      factory = PositionFilterFactory.class, 
      params = { 
       @Parameter(name = "positionIncrement", value = "100") 
      } 
     ), 
     @TokenFilterDef(
      factory = PhoneticFilterFactory.class, 
      params = { 
       @Parameter(name = "encoder", value="RefinedSoundex"), 
       @Parameter(name = "inject", value="true") 
      } 
     ) 
    } 
) 
}) 

Выше моего анализатора Определение, где я использую PatternTokenizerFactory по времени индексирования фразы с несколькими словами. И еще один с StandardTokenizerFactory с ShingleFilterFactory, который будет использоваться во время запроса, но, тем не менее, я не могу получить комбинации токенов из своего поискового запроса. Что я ожидал, что было: когда поисковый запрос Мой Поиск Запрос, он должен был мой поиск и поисковый запрос, но вместо этого я получаю мой, поиск и запросКак заставить ShingleFilterFactory работать с Hibernate Search?

Ниже моя функция

FullTextSession fullTextSession = Search.getFullTextSession(session); 
      Transaction tx = fullTextSession.beginTransaction(); 
      // create native Lucene query 
      org.apache.lucene.search.Query luceneQuery = null; 
      String[] fields = new String[] {"tags"}; 
      MultiFieldQueryParser parser = new MultiFieldQueryParser(
        Version.LUCENE_31, fields, fullTextSession.getSearchFactory().getAnalyzer("querytime")); 
      try { 
       luceneQuery = parser.parse(searchQuery); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 

      // wrap Lucene query in a org.hibernate.Query 
      org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery(luceneQuery, CityArea.class); 

      // execute search 
      List result = hibQuery.list(); 

      tx.commit(); 
      session.close(); 
      return result; 

проблема мой индекс маркера являются напр: скажем слово А, Word B и я ищу где слово a (так, чтобы он отображал запись Word A), но результата нет. Это связано с тем, что я не хочу отображать результат до тех пор, пока поисковый запрос не будет содержать индексированную фразу.

ответ

0

Ни один ответ от кого-либо не ведет себя к тому, чтобы вникать в проблему и сам нашел ответ. Поскольку это может помочь другим, я пишу здесь, а решения довольно просты, просто нужно обернуть searchQuery в кавычки.

0

я использовал:

@TokenizerDef(factory = StandardTokenizerFactory.class), 

в тегах анализатора, ваш код работает прекрасно.

сейчас мне интересно, почему вы использовали различный токенизатор для запроса и другого для магазина?

+0

Я использовал PatternTokenizerFactory в магазине (индекс), потому что мои теги разделены запятой, например: если теги были => слово А, слово В, слово С и т. Д., Я хочу индексировать слово А, слово В, слово C вместо слова, A, B, C, которое будет выполнять StandardTokenizerFactory, т.е. токенизировать с пространством или специальным символом. Но строка запроса пользовательского поиска была бы строкой, поэтому я хотел использовать ShingleFilterFactory, чтобы получить многозначный токен, чтобы иметь возможность точно искать индексированный токен. – zdesam

Смежные вопросы