Lucene 如何将ASCIIFoldingFilter与QueryParser一起使用
我正在运行最新版本的Lucene.Net(3.0.3)。(我还标记了lucene,因为它基本上是相同的架构…) 我有以下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.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*}
),但会以某种方式生成一个结果。。。但我不知道为什么