Lucene 如何将ASCIIFoldingFilter与QueryParser一起使用

Lucene 如何将ASCIIFoldingFilter与QueryParser一起使用,lucene,lucene.net,Lucene,Lucene.net,我正在运行最新版本的Lucene.Net(3.0.3)。(我还标记了lucene,因为它基本上是相同的架构…) 我有以下Lucene.Net.Analysis.Analyzer课程: public sealed class LowerCaseKeywordAnalyzer : Lucene.Net.Analysis.KeywordAnalyzer { public override TokenStream TokenStream(string fieldName,

我正在运行最新版本的Lucene.Net(3.0.3)。(我还标记了lucene,因为它基本上是相同的架构…)

我有以下
Lucene.Net.Analysis.Analyzer
课程:

public sealed class LowerCaseKeywordAnalyzer : Lucene.Net.Analysis.KeywordAnalyzer
{
    public override TokenStream TokenStream(string fieldName,
                                            TextReader reader)
    {
        var keywordTokenizer = base.TokenStream(fieldName,
                                                reader);
        var asciiFoldingFilter = new ASCIIFoldingFilter(keywordTokenizer);
        var lowerCaseFilter = new LowerCaseFilter(asciiFoldingFilter);

        return lowerCaseFilter;
    }
}
除了不同的情况外,该分析器还删除了任何特殊字符,因此,例如
Außendienst
变成
aussendienst

现在我想用“prefixQuery”搜索这个字段(我以前尝试过
Lucene.Net.search.prefixQuery
,但是这个类不允许任何分析器的注入)。我现在这样做:

var escapedLowerCaseSearchPattern = QueryParser.Escape(searchPattern);
var prefixEscapedLowerCaseSearchPattern = string.Concat(escapedLowerCaseSearchPattern,
                                                        "*");
var queryParser = new QueryParser(/* my lucene version*/,
                                  fieldName,
                                  /* a reference to a static instance of my LowerCaseKeywordAnalyzer */);
var query = queryParser.Parse(prefixEscapedLowerCaseSearchPattern);
第一个测试用例

searchPattern: Auß
fieldName: Test
searchPattern: Auß test
fieldName: Test
实际:

{Test:auß*}
{Test:auß Test:test*}
预期:

{Test:auss*}
{Test:auss test*}
第二个测试用例

searchPattern: Auß
fieldName: Test
searchPattern: Auß test
fieldName: Test
实际:

{Test:auß*}
{Test:auß Test:test*}
预期:

{Test:auss*}
{Test:auss test*}
那么,我如何利用我的
LowerCaseKeywordAnalyzer
Lucene.Net.QueryParser.QueryParser
来获得预期的结果呢?(或者有其他解决方案吗??)

好吧,我试过这个:

var escapedLowerCaseSearchPattern = QueryParser.Escape(searchPattern);
var prefixEscapedLowerCaseSearchPattern = string.Concat("\"",
                                                        escapedLowerCaseSearchPattern,
                                                        "*\"");
var queryParser = new QueryParser(/* my lucene version */,
                                  fieldName,
                                  /* a reference to a static instance of my LowerCaseKeywordAnalyzer */);
var query = queryParser.Parse(prefixEscapedLowerCaseSearchPattern);
这将生成非常有效的查询

{Test:auss*}
但不知何故不起作用

我记得当我将
Lucene.Net.Search.PrefixQuery
与非umlaut搜索模式一起使用时,我得到了结果…
然后,我想。。。好。。。只需在我的
Lucene.Net.Search.TermQuery
中使用
Lucene.Net.Index.Term
-实例中的
Lucene.Net.Search.PrefixQuery

var escapedLowerCaseSearchPattern = QueryParser.Escape(searchPattern);
var prefixEscapedLowerCaseSearchPattern = string.Concat("\"",
                                                        escapedLowerCaseSearchPattern,
                                                        "\"");
var queryParser = new QueryParser(/* my lucene version */,
                                  fieldName,
                                  /* a reference to a static instance of my LowerCaseKeywordAnalyzer */);
var termQuery = (TermQuery) queryParser.Parse(prefixEscapedLowerCaseSearchPattern);
var term = termQuery.Term;
var prefixQuery = new PrefixQuery(term);
糟糕

这将生成相同的查询(
{Test:auss*}
),但会以某种方式生成一个结果。。。但我不知道为什么