java - java中的自定义分析器,使用edgeNGram标记过滤器

标签 java elasticsearch lucene tokenize

这是我之前的 question 的延续。我正在使用 Lucene 3.6.1 并希望创建一个自定义分析器来创建如下所示的 token :-

I/P 文本:- foo bar

token :- f、fo、foo、b、ba、bar

I/P 文本:- HEllo 123

token :- h,he,hel,hell,hello,1,12,123

基本上,它将文本转换为小写,然后使用边缘 n-gram 标记过滤器。

下面是我的自定义分析器的 java 代码。

@Override
    public TokenStream tokenStream(String fieldName, Reader reader) {
        TokenStream stream = new KeywordTokenizer(reader);
        TokenStream result = new EdgeNGramTokenFilter(stream, EdgeNGramTokenFilter.Side.FRONT, 1, 30);
        //OffsetAttribute offsetAttribute = result.addAttribute(OffsetAttribute.class);
        CharTermAttribute charTermAttribute = result.addAttribute(CharTermAttribute.class);
        try {
            result.reset();
            while (result.incrementToken()) {
                //int startOffset = offsetAttribute.startOffset();
                //int endOffset = offsetAttribute.endOffset();
                System.out.println(charTermAttribute.toString());
            }
            result.end();
            result.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

但它返回以下 foo bar 的标记。

f
fo
foo
foo 
foo b
foo ba
foo bar

让我知道我的代码中缺少什么。

最佳答案

您需要使用StandardTokenizer,而不是KeywordTokenizer。后者将简单地将整个输入视为单个标记,而前者将小写并将输入拆分为多个标记。

所以改变这个:

    TokenStream stream = new KeywordTokenizer(reader);

对此:

    TokenStream stream = new StandardTokenizer(reader);

关于java - java中的自定义分析器,使用edgeNGram标记过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52033898/

相关文章:

java - java中的字节数组在从对象转换后返回null

java - 尝试从文件中读取。抛出异常

java - OOP 设计问题与纸牌游戏

elasticsearch - 我们可以将 logstash 实例部署到弹性云吗?

elasticsearch - Elasticsearch -查询仅搜索5个字符

MySQL 到 Solr 导入

java - Lucene 6.0!如何实例化 BooleanQuery 并在其中添加其他搜索查询?

java - 如何将 int 数组的运算结果转换为 double?

search - 设置solr搜索词所需字符

mongodb - 使用 MongoDB 部署 Elastic Beanstalk