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インデックス時に複数の単語で句をインデックス付けしています。 StandardTokenizerFactoryShingleFilterFactoryを照会時に使用しますが、検索クエリからトークンの組み合わせを受け取ることができません。私は期待していた何 されました:検索クエリがマイ検索クエリあるとき、それは私の検索検索クエリされている必要はなく、私は検索クエリHibernate Searchで動作するようにShingleFilterFactoryを取得するには?

を取得しています

以下は元のためにある問題は、私のインデックストークンである私の機能

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のA単語Bと私はを検索していますが、単語はです(その結果、Word Aのレコードが表示されます)が、結果は表示されません。これは、検索クエリにインデックスが付けられたフレーズが含まれるまで、結果を表示したくないためです。

答えて

0

誰も私が問題に掘り下げて答えを見つけたわけではありません。他の人を助けるかもしれないので、私はここでそれを書いています。ソリューションはかなりシンプルで、searchQueryを引用符で囲む必要があります。

0

は私が使用:あなたのタグ・アナライザで

@TokenizerDef(factory = StandardTokenizerFactory.class), 

を、あなたのコードは完全に正常に動作しています。

なぜ私はクエリと店舗用に別のトークナイザを使用したのでしょうか?

+0

タグが=>単語A、単語B、単語Cなどの場合、私のタグはカンマで区切られているので、StoreTokenizerFactoryをストア(インデックス)時間に使用しました。単語A、単語B、単語StandardTokenizerFactoryが行う単語、A、B、CではなくCで、スペースや特殊文字でトークン化します。しかし、ユーザーの検索クエリ文字列は文字列になるので、ShingleFilterFactoryを使用して、マルチワードトークンを取得して、インデックス付きトークンを正確に検索できるようにしたかったのです。 – zdesam

関連する問題