使用Hibernate Search(Lucene),我需要能够在有或没有破折号的情况下搜索代码

时间:2011-07-23 06:09:40

标签: lucene hibernate-search

这与社会保障#实际上是一样的。

如果我有这种格式的代码:

WHO-S-09-0003

我希望能够做到:

query = qb.keyword().onFields("key").matching("WHOS090003").createQuery();

我尝试使用WhitespaceAnalyzer。

2 个答案:

答案 0 :(得分:3)

使用 StandardAnalyzer WhitespaceAnalyzer 都有同样的问题。他们会将“WHO-S-09-0003”编入索引,这意味着当您进行搜索时,只有在搜索词中有连字符时才会起作用。 解决问题的一个方法是实现自己的 TokenFilter ,它会检测代码的格式并在索引编制期间删除连字符。您可以使用 AnayzerDef 构建一系列toekn过滤器和一个整体自定义分析器。当然,在搜索时你必须使用相同的分析器,但Hibernate Search查询DSL将负责这一点。

答案 1 :(得分:0)

实际上你可以像这样实现自己的方法:

private String specialCharacters(String keyword) {
    String [] specialChars = {"-","!","?"};

    for(int i = 0; i < specialChars.length; i++ ) 
        if(keyword.indexOf(specialChars[i]) > -1)
            keyword = keyword.replace(specialChars[i], "\\"+specialChars[i]);

    return keyword;
}

如你所知lucene有特殊的字符,所以如果你想要转义特殊字符,那么你应该在字符之前插入char双反斜杠......