0

SolrでWordDelimiterFilterを使用してテストを行っていますが、渡した単語の保護されたリストが保持されません。コードと出力例を調べて、どの部分が欠落しているか、または不適切に使用されているかを提案してください。

このコードを実行すると:

private static Analyzer getWordDelimiterAnalyzer() {
    return new Analyzer() {
        @Override
        public TokenStream tokenStream(String fieldName, Reader reader) {
            TokenStream stream = new StandardTokenizer(Version.LUCENE_32, reader);
            WordDelimiterFilterFactory wordDelimiterFilterFactory = new WordDelimiterFilterFactory();
            HashMap<String, String> args = new HashMap<String, String>();
            args.put("generateWordParts", "1");
            args.put("generateNumberParts", "1");
            args.put("catenateWords", "1");
            args.put("catenateNumbers", "1");
            args.put("catenateAll", "0");
            args.put("luceneMatchVersion", Version.LUCENE_32.name());
            args.put("language", "English");
            args.put("protected", "protected.txt");
            wordDelimiterFilterFactory.init(args);
            ResourceLoader loader = new SolrResourceLoader(null, null);
            wordDelimiterFilterFactory.inform(loader);
            /*List<String> protectedWords = new ArrayList<String>();
            protectedWords.add("good bye");
            protectedWords.add("hello world");
            wordDelimiterFilterFactory.inform(new LinesMockSolrResourceLoader(protectedWords));
            */
            return wordDelimiterFilterFactory.create(stream);
        }
    };
}

入力テキスト:

こんにちは世界

さようなら

今後の予定は?


保護された文字列:

さようなら

こんにちは世界


出力:

(hello、startOffset = 0、endOffset = 5、positionIncrement = 1、type =)

(world、startOffset = 6、endOffset = 11、positionIncrement = 1、type =)

(good、startOffset = 12、endOffset = 16、positionIncrement = 1、type =)

(さようなら、startOffset = 17、endOffset = 20、positionIncrement = 1、type =)

(what、startOffset = 21、endOffset = 25、positionIncrement = 1、type =)

(is、startOffset = 26、endOffset = 28、positionIncrement = 1、type =)

(your、startOffset = 29、endOffset = 33、positionIncrement = 1、type =)

(plan、startOffset = 34、endOffset = 38、positionIncrement = 1、type =)

(for、startOffset = 39、endOffset = 42、positionIncrement = 1、type =)

(future、startOffset = 43、endOffset = 49、positionIncrement = 1、type =)

4

1 に答える 1

0

少なくとも空白レベルでトークン化する標準のトークナイザーを使用しているため、常に「hello world」が「hello」と「world」に分割されます。

TokenStream stream = new StandardTokenizer(Version.LUCENE_32, reader);

Lucene のドキュメントを参照してください。

public final class StandardTokenizer は Tokenizer を拡張します

JFlex で構築された文法ベースのトークナイザー

これは、ほとんどのヨーロッパ言語のドキュメントに適したトークナイザーです。

句読点で単語を分割し、句読点を削除します。ただし、空白が続かないドットは、トークンの一部と見なされます。

トークンに数字が含まれていない限り、単語をハイフンで分割します。数字が含まれている場合、トークン全体が製品番号として解釈され、分割されません。

電子メール アドレスとインターネット ホスト名を 1 つのトークンとして認識します。

単語区切り文字で保護された単語リストは、次のようなものを対象としています。

  • ISBN2345677 は ISBN 2345677 に分割されます
  • text2html はテキスト 2 html で分割されません (保護された単語に text2html が追加されたため)

言及したようなことを本当にしたい場合は、KeywordTokenizerを使用できます。ただし、完全な分割は自分で行う必要があります。

于 2011-07-18T06:37:09.353 に答える