Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
原文:Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
Lucene有表达式就有运算符,而运算符使用起来确实很方便,但另外一个问题来了。
代码 4.3.4.1
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.
代码 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
代码 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::--
为什么会这样呢?来分析下分词输出的结果。先构造一个测试方法:
代码 4.3.4.4
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());
}
}
然后调用代码:
代码 4.3.4.5
AnalyzerConsole(new StandardAnalyzer());
AnalyzerConsole(new WhitespaceAnalyzer());
AnalyzerConsole(new StopAnalyzer());
AnalyzerConsole(new SimpleAnalyzer());
Console.ReadKey();
共测试了4个内置分词器。得出的结果是,除了WhitespaceAnalyzer,其它三个分词都把"\:"替换掉了。
输出的结果:
StandardAnalyzer
WhitespaceAnalyzer
\:
StopAnalyzer
SimpleAnalyzer
看来,特殊符号的问题,还是跟分词器息息相关的。
这个就说明一个问题,在使用多条件或者构造搜索表单式的时候尽量使用内置类,而尽量不要手动构造查询字符串。
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)的更多相关文章
- Lucene.Net 2.3.1开发介绍 —— 四、搜索(二)
原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(二) 4.3 表达式用户搜索,只会输入一个或几个词,也可能是一句话.输入的语句是如何变成搜索条件的上一篇已经略有提及. 4.3.1 观察 ...
- Lucene.Net 2.3.1开发介绍 —— 四、搜索(一)
原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(一) 既然是内容筛选,或者说是搜索引擎,有索引,必然要有搜索.搜索虽然与索引有关,那也只是与索引后的文件有关,和索引的程序是无关的,因此 ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(四)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(四) 4.索引对搜索排序的影响 搜索的时候,同一个搜索关键字和同一份索引,决定了一个结果,不但决定了结果的集合,也确定了结果的顺序.那个 ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(四)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(四) 2.1.2 可以使用的内置分词 简单的分词方式并不能满足需求.前文说过Lucene.Net内置分词中StandardAnalyze ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(三)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(三) 3.Field配置所产生的效果 索引数据,简单的代码,只要两个方法就搞定了,而在索引过程中用到的一些类里最简单,作用也不小的就是F ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(二)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(二) 2.索引中用到的核心类 在Lucene.Net索引开发中,用到的类不多,这些类是索引过程的核心类.其中Analyzer是索引建立的 ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(五) 2.1.3 二元分词 上一节通过变换查询表达式满足了需求,但是在实际应用中,如果那样查询,会出现另外一个问题,因为,那样搜索,是只 ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(七)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(七) 5.IndexWriter 索引这部分最后讲的是IndexWriter.如果说前面提到的都是数据的结构,那么IndexWriter ...
随机推荐
- Linux之shell编程基础
一.变量 变量在shell中分为:本地变量.环境变量.位置参数: 本地变量:仅可在用户当前shell生命期的脚本中使用的变量,本地变量随着shell进程的消亡而无效,本地变量在新启动的shell中依旧 ...
- linux环境ubuntu: pushd: not found
编译错误: /bin/sh: 1: pushd: not found的问题 http://www.cnblogs.com/wansui/p/4230869.html 查看原因:进入/bin目录,查看s ...
- c# 阶段总结
然并卵然并卵然并卵然并卵然并卵然并卵然并卵
- IOS SWIFT 网络请求JSON解析 基础一
前言:移动互联网时代,网络通信已经是手机端必不可少的功能.应用中也必不可少地使用了网络通信,增强客户端与服务器交互.使用NSURLConnection实现HTTP的通信.NSURLConnection ...
- uva 10313 Pay the Price(完全背包)
题目连接:10313 - Pay the Price 题目大意:有0~300这300种价值的金额. 现在可能给出参数: 1个:n, 输出可以组成价值n的方式的个数. 2个:n, a输出用个数小于a的价 ...
- HNCU1741:算法3-2:行编辑程序
http://hncu.acmclub.com/index.php?app=problem_title&id=111&problem_id=1741 题目描述 一个简单的行编辑程序的功 ...
- HDOJ 5071 Chat 模拟
大模拟: 1>saygoodbye要先对 always on top 的人说 2>对没有说过话的不要说good bye 3>用long long Chat Time Limit: 2 ...
- wkhtmltopdf 生成pdf
public class PdfHelper { static string RootPath { get { string AppPath = ""; HttpContext H ...
- fileziller 恢复 站点管理器 内的ftp帐号方法
由于系统坏了重装了系统,以前的fileziller中配置的服务器链接信息列表很多,新装fileziller后即使复制以前的安装目录过来,站点管理器内还是空荡荡的. 这些服务器链接的配置信息非常重要,如 ...
- 我是小白之<%%>用法
下面知识都是摘录自网络 <%= %>输出,等价于Response.Write()<%%> 写代码<%-- --%>注释. <% %>跟其它serv ...