如何使用Lucene Analyzer来标记字符串?

Fel*_*mel 38 java lucene tokenize analyzer

有没有一种简单的方法可以使用Lucene的任何子类Analyzer来解析/标记化String

就像是:

String to_be_parsed = "car window seven";
Analyzer analyzer = new StandardAnalyzer(...);
List<String> tokenized_string = analyzer.analyze(to_be_parsed);
Run Code Online (Sandbox Code Playgroud)

Ben*_*ann 57

基于上面的答案,稍微修改它以使用Lucene 4.0.

public final class LuceneUtil {

  private LuceneUtil() {}

  public static List<String> tokenizeString(Analyzer analyzer, String string) {
    List<String> result = new ArrayList<String>();
    try {
      TokenStream stream  = analyzer.tokenStream(null, new StringReader(string));
      stream.reset();
      while (stream.incrementToken()) {
        result.add(stream.getAttribute(CharTermAttribute.class).toString());
      }
    } catch (IOException e) {
      // not thrown b/c we're using a string reader...
      throw new RuntimeException(e);
    }
    return result;
  }

}
Run Code Online (Sandbox Code Playgroud)

  • 在Lucene 4.1中,你还需要在`while`语句之前添加`stream.reset()` (13认同)
  • 你可能想添加一个`stream.end(); stream.close();`在while斜率之后. (2认同)

ste*_*vls 39

据我所知,你必须自己编写循环.这样的东西(直接来自我的源代码树):

public final class LuceneUtils {

    public static List<String> parseKeywords(Analyzer analyzer, String field, String keywords) {

        List<String> result = new ArrayList<String>();
        TokenStream stream  = analyzer.tokenStream(field, new StringReader(keywords));

        try {
            while(stream.incrementToken()) {
                result.add(stream.getAttribute(TermAttribute.class).term());
            }
        }
        catch(IOException e) {
            // not thrown b/c we're using a string reader...
        }

        return result;
    }  
}
Run Code Online (Sandbox Code Playgroud)

  • 还有一点需要注意:从Lucene 3.2开始,不推荐使用TermAttribute来支持CharTermAttribute. (10认同)
  • @aclokay 6年后?哈 (4认同)