2017-12-11 2 views
0

영어와 일본어 두 개의 분석기를 사용하여 FeatureMeta에 주석을 달았습니다.최대 절전 모드 검색 | Lucene Kuromojo 분석기는 메소드 이름에 따라 달라집니다.

내 저장소 클래스에서 FeatureMeta 엔터티를 "findFeatures"로 검색하는 메서드의 이름을 지정했습니다. 나는 예외 다음 저장소에서 "findFeatures"방법을 액세스 할 때

는하지만 발생되지 : java.lang.IllegalArgumentException가 :

에 의해 야기되는 열거 상수 org.apache.lucene.analysis합니다. 어떻게 든 후드, "JapaneseTokenizerFactory"나는 내 저장소 (findFeatures)에 사용되는 메소드 이름의 값 열거를 만들려고 ja.JapaneseTokenizer.Mode.FINDFEATURES

참고.

왜 JapaneseTokenizerFactory의 논리와 내 저장소 이름 사이에 관계가 있는지 잘 모르겠습니다.

Entity 클래스 :

@Entity 
@Table(name="feature_meta") 
@Indexed 
@AnalyzerDef(name = "japaneseAnalyzer", 
     tokenizer = @TokenizerDef(factory = JapaneseTokenizerFactory.class, 
       params = {@Parameter(name = "mode", value = "findFeatures"), 
         }), 
     filters = { 
       @TokenFilterDef(factory = JapaneseBaseFormFilterFactory.class), 
       @TokenFilterDef(factory = JapanesePartOfSpeechStopFilterFactory.class, 
         params = @Parameter(name = "tags", value = "org/apache/lucene/analysis/ja/stoptags.txt")), 
       @TokenFilterDef(factory = CJKWidthFilterFactory.class), 
       @TokenFilterDef(factory = StopFilterFactory.class, 
         params = @Parameter(name = "words", value = "org/apache/lucene/analysis/ja/stopwords.txt")), 
       @TokenFilterDef(factory = JapaneseKatakanaStemFilterFactory.class), 
       @TokenFilterDef(factory = LowerCaseFilterFactory.class) 
     }) 
@AnalyzerDef(name = "englishAnalyzer", 
     tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class), 
     filters = { 
       @TokenFilterDef(factory = LowerCaseFilterFactory.class), 
       @TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = { 
         @Parameter(name = "language", value = "English") 
       }) 
     }) 

public class FeatureMeta implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @Column(name="feature_id",unique = true) 
    private String featureId; 

    @Column(name="category_id") 
    @Field(name = "categoryId", analyze=Analyze.NO) 
    private String categoryId; 

    @Field(name="featureSetId",analyze=Analyze.NO) 
    @Column(name = "feature_set_id") 
    private String featureSetId; 

    @Enumerated(EnumType.STRING) 
    @Column(name="feature_type") 
    private EnumFeatureType featureType; 

    @Fields({@Field(name="name_en", [email protected](definition="englishAnalyzer"))}) 
    @Column(name="name_en") 
    @Lob 
    private String nameEn; 

    @Fields({@Field(name="name_ja", [email protected](definition="japaneseAnalyzer"))}) 
    @Column(name="name_ja") 
    @Lob 
    private String nameJa; 

    @Fields({@Field(name="desc_en", [email protected](definition="englishAnalyzer"))}) 
    @Column(name="desc_en") 
    @Lob 
    private String descEn; 

    .. 


} 

Repostory : org.hibernate.search.exception.SearchException :에 의한

@Repository 
public class FeatureSegmentMetaSearchRepository { 

    @PersistenceContext 
    private EntityManager entityManager; 

    public FeatureMetaSearchResult findFeatures(Integer offset, Integer pageSize, String text, String categoryId, String featureSetId, Collection<String> tags) { 

     FeatureMetaSearchResult ret = new FeatureMetaSearchResult(); 
     FullTextEntityManager fullTextEntityManager = 
       org.hibernate.search.jpa.Search. 
         getFullTextEntityManager(entityManager); 
     //Filtering by keyword 
     QueryBuilder queryBuilder = 
       fullTextEntityManager.getSearchFactory() 
         .buildQueryBuilder().forEntity(FeatureMeta.class).get(); 
     org.apache.lucene.search.Query queryKeyword = null; 
     if (StringUtils.isEmpty(text)) { 
      queryKeyword = queryBuilder.all().createQuery(); 
     } else { 
      queryKeyword = queryBuilder 
        .keyword() 
        .onFields("name_en","name_ja", "desc_en", "desc_ja","business_desc_en","business_desc_ja", 
          "logical_desc_en", "logical_desc_ja") 
        .matching(text) 

        .createQuery(); 
     } 
     BooleanQuery.Builder aggrBuilder = new BooleanQuery.Builder(); 
     aggrBuilder = aggrBuilder.add(new BooleanClause(queryKeyword, BooleanClause.Occur.MUST)); 

     if (categoryId != null) { 
      TermQuery queryFilter = new TermQuery(new Term("categoryId",categoryId)); 
      aggrBuilder = aggrBuilder.add(new BooleanClause(queryFilter, BooleanClause.Occur.MUST)); 
     } 
     if (featureSetId != null) { 
      String setFilter = new EnumBridge().objectToString(featureSetId); 
      TermQuery queryFilter = new TermQuery(new Term("featureSetId", setFilter)); 
      aggrBuilder = aggrBuilder.add(new BooleanClause(queryFilter, BooleanClause.Occur.MUST)); 
     } 

     if(!CollectionUtils.isEmpty(tags)) { 
      for (String tag : tags) { 
       TermQuery queryFilter = new TermQuery(new Term("tags", tag)); 
       aggrBuilder = aggrBuilder.add(new BooleanClause(queryFilter, BooleanClause.Occur.MUST)); 
      } 
     } 

     org.hibernate.search.jpa.FullTextQuery jpaQuery = 
       fullTextEntityManager.createFullTextQuery(aggrBuilder.build(), FeatureMeta.class); 

     if (offset != null) jpaQuery.setFirstResult(offset); 
     if (pageSize != null) jpaQuery.setMaxResults(pageSize); 

     ret.setTotalCount(jpaQuery.getResultSize()); 
     ret.setResults(jpaQuery.getResultList()); 
     return ret; 
    } 
} 

할 수 없음 인스턴스화 토큰 화 공장 클래스 : org.apache .lucene.analysis.ja.JapaneseTokenizerFactory. 구현 클래스가 적용된 매개 변수를 인식하지 못했습니다. 조직에서 org.hibernate.search.analyzer.impl.LuceneAnalyzerBuilder.buildAnalysisComponent (LuceneAnalyzerBuilder.java:147) 에서 org.hibernate.search.util.impl.ClassLoaderHelper.instanceFromClass (ClassLoaderHelper.java:156)에서 . hibernate.search.analyzer.impl.LuceneAnalyzerBuilder.buildAnalyzer org.hibernate.search에서 org.hibernate.search.analyzer.impl.LuceneAnalyzerBuilder.buildAnalyzer (LuceneAnalyzerBuilder.java:76) 에서 (LuceneAnalyzerBuilder.java:105). analyzer.impl.NamedLuceneAnalyzerReference.createAnalyzer (NamedLuceneAnalyzerReference.java:64) at org.hibernate.search.analyzer.impl.NamedLuceneAnalyzerReference.initialize (NamedLuceneAnalyzerRe ference.java:60) org.hibernate.search.analyzer.impl.LuceneEmbeddedAnalyzerStrategy.initializeReference org.hibernate.search.analyzer.impl.LuceneEmbeddedAnalyzerStrategy.lambda $ initializeReferences $ 0 (LuceneEmbeddedAnalyzerStrategy.java:234) 에서 (LuceneEmbeddedAnalyzerStrategy 된 .java : 192) 자바에서 java.util.stream.Streams $ ConcatSpliterator.forEachRemaining (Streams.java:742) 에서 인 java.util.ArrayList $ ArrayListSpliterator.forEachRemaining (ArrayList.java:1374) 에서 . util.stream.ReferencePipeline $ Head.forEach (ReferencePipeline.java:580) at org.hibernate.search.analyzer.impl.LuceneEmbeddedAnalyzerStrategy.initializeRe ferences org.hibernate.search.engine.impl.ConfigContext.initIntegrations에서 org.hibernate.search.engine.impl.SearchIntegrationConfigContext.initialize (SearchIntegrationConfigContext.java:72)에서 (LuceneEmbeddedAnalyzerStrategy.java:192) (ConfigContext.자바 : 252) org.hibernate.search.spi.SearchIntegratorBuilder.initDocumentBuilders (SearchIntegratorBuilder.java:469) 에서 org.hibernate.search.spi.SearchIntegratorBuilder.createNewFactoryState (SearchIntegratorBuilder.java:243에서) 조직에서 org.hibernate.search.hcore.impl에서 .hibernate.search.spi.SearchIntegratorBuilder.buildNewSearchFactory org.hibernate.search.spi.SearchIntegratorBuilder.buildSearchIntegrator (SearchIntegratorBuilder.java:127)에서 (SearchIntegratorBuilder.java:199) .HibernateSearchSessionFactoryObserver.boot (HibernateSearchSessionFactoryObserver.java:113) at org.hibernate.search.hcore.impl.Hibernat 에서 eSearchSessionFactoryObserver.sessionFactoryCreated org.hibernate.internal.SessionFactoryImpl에서 org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated (SessionFactoryObserverChain.java:35)에서 (HibernateSearchSessionFactoryObserver.java:79) . (SessionFactoryImpl.java:375) org.hibernate.boot.internal.SessionFactoryBuilderImpl.build org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build (EntityManagerFactoryBuilderImpl.java:889)에서 (SessionFactoryBuilderImpl.java:452) ...는 46 이상에 의한 : null가 아닌 경우는 true t java.lang.reflect.Constructor.newInstance에서 sun.reflect.NativeConstructorAccessorImpl.newInstance sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45)에서 (NativeConstructorAccessorImpl.java:62) (Constructor.java:423) org.hibernate.search.util.impl.ClassLoaderHelper.instanceFromClass (ClassLoaderHelper.java:152) ... 이상에 의한 69 : java.lang.IllegalArgumentException가 없음 ENUM 상수 org.apache.lucene. analysis.ja.JapaneseTokenizer.Mode.FINDFEATURES at java.lang.Enum.valueOf (Enum.java:238) at org.apache.lucene.analysis.ja.JapaneseTokenizer $ Mode.valueOf (JapaneseTokenizer.java:78) org.apache.lucene.analysis.ja.JapaneseTokenizerFactory. (JapaneseTokenizerFactory.java:73) 에서... 74 개

답변

3

문제는 법의 이름으로하지만 분석기의 정의와이 아니다.

당신이 있습니다

tokenizer = @TokenizerDef(factory = JapaneseTokenizerFactory.class, 
       params = {@Parameter(name = "mode", value = "findFeatures"), 
         }), 

즉 당신이 모드로 "findFeatures"를 사용하고 있습니다. 지원되는 모드를 사용해야합니다.

+0

지적 해 주셔서 고마워. IDE의 메서드 이름 리팩터가이 값을 변경했다. –

관련 문제