java - 如何在使用 hibernate search/lucene 建立索引期间去除空格和特殊字符

标签 java regex lucene indexing hibernate-search

我有一个字段,我想将其视为单个字符串,同时从中删除所有非字母数字字符。

例如,我想将“123 456.78-9”标记为“123456789”。为了做到这一点,我一直在尝试定义我自己的分析器。根据 solr 页面,KeywordTokenizerFactory 会将字符串视为单个术语,我可以使用 PatternReplaceFilterFactory 按我的意愿删除字符。

我在代码中使用以下定义,但它不起作用:

@AnalyzerDef(name = "strippinganalyzer",
    tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class),
    filters = {
            @TokenFilterDef(factory = PatternReplaceFilterFactory.class,
                    params = { 
                        @org.hibernate.search.annotations.Parameter(name = "pattern", value="([^a-zA-Z0-9])"),
                        @org.hibernate.search.annotations.Parameter(name="replacement", value=""),
                        @org.hibernate.search.annotations.Parameter(name="replace", value="all")
                    }
            )
    })

这匹配“123*”,但不匹配“1234*”等。我错过了什么?

谢谢

最佳答案

创建自定义分析器似乎可以解决问题:

public class AlphanumericAnalyzer extends Analyzer {

    @Override
    public TokenStream tokenStream(String fieldName, Reader reader) {

        return new TrimFilter(new PatternReplaceFilter(new LowerCaseFilter(new KeywordTokenizer(reader)), Pattern.compile("[^a-zA-Z0-9]"), "", true), true);
    }
}

关于java - 如何在使用 hibernate search/lucene 建立索引期间去除空格和特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7666200/

相关文章:

java - num=+10 和 num+=10 有什么区别?

java - 使用 Redis Sentinel 正确配置 @EnableRedisHttpSession

mysql - 如何在 MySQL 中获取包含 [a-zA-Z] 以外字符的所有行

java - 正则表达式 - 文字字符串和引号之间的匹配

java - 未正确加密和解​​密

c# - 在各种技术之间传递数据

regex - RegEx需要将数字精确匹配到小数点后两位

java - 用于搜索的同义词数据结构

security - 是否可以将 Solr 与 SSL 和 CA 签名证书一起使用

grafana中的elasticsearch lucene查询