Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)

释放双眼,带上耳机,听听看~!

原文:Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)

Lucene有表达式就有运算符,而运算符使用起来确实很方便,但另外一个问题来了。

Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
代码 4.3.4.1
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
Analyzer analyzer 

 
new
 StandardAnalyzer();
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)QueryParser parser 

 
new
 QueryParser(
"
title
"
, analyzer);
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Query query 

 parser.Parse(
@"
:
"
);
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Console.WriteLine(
"

"
 
+
 query.ToString() 
+
 
"

"
);
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Console.ReadKey();

 

运行代码4.3.4.1,发现会引发错误。

未处理 Lucene.Net.QueryParsers.ParseException
Message="Cannot parse ':': Encountered ":" at line 1, column 0.\nWas expecting one of:\n    <NOT> …\n    "+" …\n    "-" …\n    "(" …\n    "*" …\n    <QUOTED> …\n    <TERM> …\n    <PREFIXTERM> …\n    <WILDTERM> …\n    "[" …\n    "{" …\n    <NUMBER> …\n    "
Source="Lucene.Net"
StackTrace:
在 Lucene.Net.QueryParsers.QueryParser.Parse(String query) 位置 D:\Lucene.Net\Lucene.Net\QueryParser\QueryParser.cs:行号 186
在 TestLucene.Program.Main(String[] args) 位置 D:\TestLucene\TestLucene\TestLucene\Program.cs:行号 23
在 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Threading.ThreadHelper.ThreadStart()
InnerException:

 

":"符号死特殊符号,只有这样一个符号是无法解析的。如果实在需要搜索这个符号,那么给它加上一个""。代码就变成了4.3.4.2.

 

Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
代码 4.3.4.2
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
Analyzer analyzer 

 
new
 SimpleAnalyzer();
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)QueryParser parser 

 
new
 QueryParser(
"
title
"
, analyzer);
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Query query 

 parser.Parse(
@"
:
"
);
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Console.WriteLine(
"

"
 
+
 query.ToString() 
+
 
"

"
);
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Console.ReadKey();

 

运行输出:


发现":"并没有预想的那样,输出一个":"出来。大多数时候可能并不会引人注意,实际上确实有很多人会认为这个符号可能是在Lucene内部被替换掉了。那么实际情况呢?如果不看Lucene的代码,盲目尝试的话,很难尝试出来,这里就不细说了。

把代码改成4.3.4.3

Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
代码 4.3.4.3
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
Analyzer analyzer 

 
new
 WhitespaceAnalyzer();
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)QueryParser parser 

 
new
 QueryParser(
"
title
"
, analyzer);
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Query query 

 parser.Parse(
@"
:
"
);
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Console.WriteLine(
"

"
 
+
 query.ToString() 
+
 
"

"
);
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Console.ReadKey();

 

换了个分词器,效果就不一样了,嘿嘿。4.3.4.3输出内容就变成了:

–title::–

为什么会这样呢?来分析下分词输出的结果。先构造一个测试方法:

Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
代码 4.3.4.4
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
void
 AnalyzerConsole(Analyzer analyzer)
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
{
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)    TokenStream stream 

 analyzer.TokenStream(
"
title
"

new
 StringReader(
@"
:
"
));
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)    Lucene.Net.Analysis.Token token;
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)    Console.WriteLine(analyzer.GetType().Name);
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)    
while
 ((token 

 stream.Next()) 
!=
 
null
)
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)    
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
{
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)        Console.WriteLine(token.TermText());
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)    }
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)}

 

然后调用代码:

 

Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
代码 4.3.4.5
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
AnalyzerConsole(
new
 StandardAnalyzer());
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)AnalyzerConsole(
new
 WhitespaceAnalyzer());
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)AnalyzerConsole(
new
 StopAnalyzer());
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)AnalyzerConsole(
new
 SimpleAnalyzer());
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Console.ReadKey();

 

共测试了4个内置分词器。得出的结果是,除了WhitespaceAnalyzer,其它三个分词都把":"替换掉了。

输出的结果:

StandardAnalyzer
WhitespaceAnalyzer
:
StopAnalyzer
SimpleAnalyzer

看来,特殊符号的问题,还是跟分词器息息相关的。

这个就说明一个问题,在使用多条件或者构造搜索表单式的时候尽量使用内置类,而尽量不要手动构造查询字符串。

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索