原文: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开发介绍 —— 四、搜索(三)的更多相关文章

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

    原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(二) 4.3 表达式用户搜索,只会输入一个或几个词,也可能是一句话.输入的语句是如何变成搜索条件的上一篇已经略有提及. 4.3.1 观察 ...

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

    原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(一) 既然是内容筛选,或者说是搜索引擎,有索引,必然要有搜索.搜索虽然与索引有关,那也只是与索引后的文件有关,和索引的程序是无关的,因此 ...

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

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(四) 4.索引对搜索排序的影响 搜索的时候,同一个搜索关键字和同一份索引,决定了一个结果,不但决定了结果的集合,也确定了结果的顺序.那个 ...

  4. Lucene.Net 2.3.1开发介绍 —— 二、分词(四)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(四) 2.1.2 可以使用的内置分词 简单的分词方式并不能满足需求.前文说过Lucene.Net内置分词中StandardAnalyze ...

  5. Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...

  6. Lucene.Net 2.3.1开发介绍 —— 三、索引(三)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(三) 3.Field配置所产生的效果 索引数据,简单的代码,只要两个方法就搞定了,而在索引过程中用到的一些类里最简单,作用也不小的就是F ...

  7. Lucene.Net 2.3.1开发介绍 —— 三、索引(二)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(二) 2.索引中用到的核心类 在Lucene.Net索引开发中,用到的类不多,这些类是索引过程的核心类.其中Analyzer是索引建立的 ...

  8. Lucene.Net 2.3.1开发介绍 —— 二、分词(五)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(五) 2.1.3 二元分词 上一节通过变换查询表达式满足了需求,但是在实际应用中,如果那样查询,会出现另外一个问题,因为,那样搜索,是只 ...

  9. Lucene.Net 2.3.1开发介绍 —— 三、索引(七)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(七) 5.IndexWriter 索引这部分最后讲的是IndexWriter.如果说前面提到的都是数据的结构,那么IndexWriter ...

随机推荐

  1. THUSC2015

    这些题目在BZOJ上面有,可惜是权限题.话说BZOJ上面的题目真的挺好的,要不是我穷,早就去弄个号了! 言归正传,今年的题目难度可以由一个名人名言看出: 题目太水.--某某神犇 可是我掂量了一下,发现 ...

  2. 北京创客空间 BEIJING MAXPACE的小站

    北京创客空间 BEIJING MAXPACE的小站 北京市海淀区海淀大街1号中关村梦想实验室(原中关村国际数字设计中心)4层

  3. python模块介绍- multi-mechanize 性能测试工具

    python模块介绍- multi-mechanize 性能测试工具 2013-09-13 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 3739 ...

  4. POJ 3422 Kaka&#39;s Matrix Travels (最小费用最大流)

    POJ 3422 Kaka's Matrix Travels 链接:http://poj.org/problem? id=3422 题意:有一个N*N的方格,每一个方格里面有一个数字.如今卡卡要从左上 ...

  5. Excel自己定义纸张打印设置碰到无法对上尺寸的问题

    作者:iamlaosong 据操作人员反映.自己定义纸张设置无论用,打印时每页表头都会下移,非常快就跑偏到下涨纸了. 打印机是针打,齿轮进纸.应该非常精确的.初步怀疑纸张尺寸量的有问题,建议其多量几页 ...

  6. 关于std::string

    主要注意的一个问题是:std::string 实际是类似一个 vector<char>的结构. 它里面是可以存放 ascii为0 的字符不算结尾 (否则 unicode方式的编码存放就有问 ...

  7. mysql的基础操作

    查看数据库 获取服务器上的数据库列表通常很有用.执行show databases;命令就可以搞定. mysql> show databases; 创建数据库 mysql> create d ...

  8. 【译】在Asp.Net中操作PDF - iTextSharp - 使用字体

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 使用字体 紧接着前面我对iTextSharp简介博文,iTextSharp是一个免费的允许Asp.Net对PDF进行操作的第三方 ...

  9. xmlns:android="http://schemas.android.com/apk/res/android的作用是

    xmlns:android="http://schemas.android.com/apk/res/android的作用是 这个是xml的命名空间,有了他,你就可以alt+/作为提示,提示你 ...

  10. 9天快速入门java

    Java入门教程[9天快速入门JAVA] §1.3.简单的Java程序 下面我们先介绍两个简单的Java程序,并对其进行分析. 例1.1. public class HelloWorldApp{//a ...