[转]Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
Lucene有表达式就有运算符,而运算符使用起来确实很方便,但另外一个问题来了。
Analyzer analyzer = new StandardAnalyzer();
QueryParser parser = new QueryParser("title", analyzer);
Query query = parser.Parse(@":");
Console.WriteLine("--" + query.ToString() + "--");
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.
Analyzer analyzer = new SimpleAnalyzer();
QueryParser parser = new QueryParser("title", analyzer);
Query query = parser.Parse(@"\:");
Console.WriteLine("--" + query.ToString() + "--");
Console.ReadKey();
运行输出:
----
发现"\:"并没有预想的那样,输出一个":"出来。大多数时候可能并不会引人注意,实际上确实有很多人会认为这个符号可能是在Lucene内部被替换掉了。那么实际情况呢?如果不看Lucene的代码,盲目尝试的话,很难尝试出来,这里就不细说了。
把代码改成4.3.4.3
Analyzer analyzer = new WhitespaceAnalyzer();
QueryParser parser = new QueryParser("title", analyzer);
Query query = parser.Parse(@"\:");
Console.WriteLine("--" + query.ToString() + "--");
Console.ReadKey();
换了个分词器,效果就不一样了,嘿嘿。4.3.4.3输出内容就变成了:
--title::--
为什么会这样呢?来分析下分词输出的结果。先构造一个测试方法:
void AnalyzerConsole(Analyzer analyzer){
TokenStream stream = analyzer.TokenStream("title", new StringReader(@"\:"));
Lucene.Net.Analysis.Token token;
Console.WriteLine(analyzer.GetType().Name);
while ((token = stream.Next()) != null)
{
Console.WriteLine(token.TermText());
}
}
然后调用代码:
AnalyzerConsole(new StandardAnalyzer());
AnalyzerConsole(new WhitespaceAnalyzer());
AnalyzerConsole(new StopAnalyzer());
AnalyzerConsole(new SimpleAnalyzer());
Console.ReadKey();
共测试了4个内置分词器。得出的结果是,除了WhitespaceAnalyzer,其它三个分词都把"\:"替换掉了。
输出的结果:
StandardAnalyzer
WhitespaceAnalyzer
\:
StopAnalyzer
SimpleAnalyzer
看来,特殊符号的问题,还是跟分词器息息相关的。
这个就说明一个问题,在使用多条件或者构造搜索表单式的时候尽量使用内置类,而尽量不要手动构造查询字符串。
http://www.cnblogs.com/birdshover/archive/2008/12/01/1345012.html
- ·lucene中文分词器--..
- ·Lucene.Net 2.3.1开..
- ·Lucene.Net 2.3.1开..
- ·Lucene.Net 2.3.1开..
- ·中文分词算法
- ·Lucene.Net 2.3.1开..
- ·Lucene.Net 2.3.1开..
- ·lucene.net 2.0 中文..
- flash/flex/fcs/AIR(752)
- Asp.Net/C#/WCF(598)
- 操作系统及应用软件(376)
- JavaScript/Ajax(330)
- SQL及数据库(134)
- 黑客技术(115)
- Asp/VBScript(111)
- HTML/WML/CSS兼容/XML(102)
- PHP/apache/Perl(96)
- 网站排名及优化(96)
- 其他(75)
- showbo日志(66)
- lucene.net/分词技术(33)
- 计算机网络(26)
- 机械重工(26)
- C#设计模式(25)
- Google Maps开发(17)
- 日语学习(15)
- Canvas/VML/SVG(13)
- linux(11)
- 游戏开发(8)
- 正则表达式(5)
- Jsp/Java(4)
- ·Lucene.Net实现Grou..
- ·Lucene.Net 按类别统..
- ·关于Lucene.Net 2.3..
- ·《Lucene天书》 Luc..
- ·Lucene.Net 2.3.1开..
- ·Lucene.Net 2.3.1开..
- ·Lucene.Net 2.3.1开..
- ·Lucene.Net 2.3.1开..
