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を使用して、複数の単語を含むフレーズにインデックスを付けています。もう1つは、クエリ時にShingleFilterFactoryを使用するStandardTokenizerFactory使用しますが、検索クエリからトークンの組み合わせを受け取ることができません。私が期待していたのは、検索クエリがMy Search Queryの場合、それはmy searchおよびsearch queryであるはずでしたが、代わりにmysearchおよびqueryを取得しています

以下は私の機能です

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 AWord Bと言って、単語 a がどこにあるかを検索しています ( Word A のレコードが表示されるように)が、結果はありません。これは、インデックス化されたフレーズが検索クエリに含まれるまで結果を表示したくないためです。

4

2 に答える 2

0

誰からの答えも、問題を掘り下げて自分で答えを見つけることにつながることはありません。他の人に役立つかもしれないので、ここに書いています。解決策は非常に単純です。searchQueryを引用符で囲む必要があります。

于 2012-05-14T06:45:57.830 に答える
0

私は使用しました:

@TokenizerDef(factory = StandardTokenizerFactory.class),

タグ アナライザーでは、コードは完全に正常に動作しています。

なぜ、クエリ用とストア用に異なるトークナイザーを使用したのでしょうか?

于 2014-05-27T13:44:49.093 に答える