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

简介: 原文:Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)Lucene有表达式就有运算符,而运算符使用起来确实很方便,但另外一个问题来了。 代码 4.3.4.1Analyzer analyzer = new StandardAnalyzer();QueryParser parser ...
原文: Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)

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

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 代码 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.

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 代码 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

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 代码 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::--

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

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 代码 4.3.4.4
void AnalyzerConsole(Analyzer analyzer)
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
{
    TokenStream stream 
= analyzer.TokenStream("title"new StringReader(@"\:"));
    Lucene.Net.Analysis.Token token;
    Console.WriteLine(analyzer.GetType().Name);
    
while ((token = stream.Next()) != null)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
{
        Console.WriteLine(token.TermText());
    }

}

 

然后调用代码:

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 代码 4.3.4.5
AnalyzerConsole(new StandardAnalyzer());
AnalyzerConsole(
new WhitespaceAnalyzer());
AnalyzerConsole(
new StopAnalyzer());
AnalyzerConsole(
new SimpleAnalyzer());
Console.ReadKey();

 

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

输出的结果:
StandardAnalyzer
WhitespaceAnalyzer
\:
StopAnalyzer
SimpleAnalyzer

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

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

目录
相关文章
|
10月前
|
人工智能 芯片
D1net阅闻|OpenAI员工疯狂暗示,内部已成功开发ASI?被曝训出GPT-5但雪藏
D1net阅闻|OpenAI员工疯狂暗示,内部已成功开发ASI?被曝训出GPT-5但雪藏
|
8月前
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
347 0
|
Linux API C#
基于 .NET 开发的多功能流媒体管理控制平台
基于 .NET 开发的多功能流媒体管理控制平台
219 9
|
Web App开发 前端开发 调度
一款基于 .NET + Blazor 开发的智能访客管理系统
一款基于 .NET + Blazor 开发的智能访客管理系统
189 8
|
前端开发 JavaScript C#
基于.NET8+Vue3开发的权限管理&个人博客系统
基于.NET8+Vue3开发的权限管理&个人博客系统
194 7
|
网络协议 C#
基于.NET WinForm开发的一款硬件及协议通讯工具
基于.NET WinForm开发的一款硬件及协议通讯工具
150 7
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
382 5
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
458 0
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
242 7
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
281 0