Lucene.Net 2.3.1开发介绍 —— 四、搜索(二)
2015-06-26 17:45
281 查看
原文:Lucene.Net 2.3.1开发介绍 —— 四、搜索(二) 4.3 表达式
用户搜索,只会输入一个或几个词,也可能是一句话。输入的语句是如何变成搜索条件的上一篇已经略有提及。
4.3.1 观察表达式
在研究表达式之前,一定要知道,任何一个Query都会对于一个表达式。不光可以通过Query构造表达式,还可以通过拼接字符串构造。这里说的观察表达式是指,用Query完成查询语句后,用ToString()方法输出Query的表达式。很简单是吧,呵呵。
4.3.2 表达式的与或非
“与或非”让我想起上学的时候学的门电路 ==#。先动手看看什么是与或非。
测试:
搜索词:真是
结果:
+content:真 +content:是
测试测
-----------------------------------
构造出与的表达式了。把BooleanQuery的Add方法第二个参数换成BooleanClause.Occur.SHOULD,
bquery.Add(query, BooleanClause.Occur.SHOULD);
这个就是或:
搜索词:真是
结果:
content:真 content:是
测试测
测试
-----------------------------------
而换成 bquery.Add(query, BooleanClause.Occur.MUST_NOT);这个就是非了:
搜索词:真是
结果:
-content:真 -content:是
-----------------------------------
4.3.4 其它特使符号
如果形容"+-"为Lucene.Net的运算符的话,那只有这么两个也太单调了。实际上它还有其它运算符。
+-!():^[]{}~*?
上面的字符都是它的运算符号,这么多运算符用起来很方便。但是也就出现另外一个问题。
什么问题?下一节再讲。
用户搜索,只会输入一个或几个词,也可能是一句话。输入的语句是如何变成搜索条件的上一篇已经略有提及。
4.3.1 观察表达式
在研究表达式之前,一定要知道,任何一个Query都会对于一个表达式。不光可以通过Query构造表达式,还可以通过拼接字符串构造。这里说的观察表达式是指,用Query完成查询语句后,用ToString()方法输出Query的表达式。很简单是吧,呵呵。
4.3.2 表达式的与或非
“与或非”让我想起上学的时候学的门电路 ==#。先动手看看什么是与或非。
代码 4.3.3.1 /// <summary> /// 执行测试的入口 /// </summary> [Test] public void SearcherTest() { Index(); List<string> list = new List<string>() { "真是" }; for (int i = 0; i < list.Count; i++) { Console.WriteLine("搜索词:" + list[i]); Console.WriteLine("结果:"); Searcher(list[i]); Console.WriteLine("-----------------------------------"); } } /// <summary> /// 搜索 /// </summary> /// <param name="querystring">搜索输入</param> private void Searcher(string querystring) { Analyzer analyzer = new StandardAnalyzer(); //构造BooleanQuery QueryParser parser = new QueryParser("content", analyzer); BooleanQuery bquery = new BooleanQuery(); TokenStream ts = analyzer.TokenStream(null, new StringReader(querystring)); Lucene.Net.Analysis.Token token; while ((token = ts.Next()) != null) { Query query = parser.Parse(token.TermText()); bquery.Add(query, BooleanClause.Occur.MUST); } //构造完成 IndexSearcher searcher = new IndexSearcher("IndexDirectory"); //Query query = parser.Parse(querystring); //输出我们要查看的表达式 Console.WriteLine(bquery.ToString()); Hits hits = searcher.Search(bquery); for (int i = 0; i < hits.Length(); i++) { Document doc = hits.Doc(i); Console.WriteLine(doc.Get("title")); } }
测试:
搜索词:真是
结果:
+content:真 +content:是
测试测
-----------------------------------
构造出与的表达式了。把BooleanQuery的Add方法第二个参数换成BooleanClause.Occur.SHOULD,
bquery.Add(query, BooleanClause.Occur.SHOULD);
这个就是或:
搜索词:真是
结果:
content:真 content:是
测试测
测试
-----------------------------------
而换成 bquery.Add(query, BooleanClause.Occur.MUST_NOT);这个就是非了:
搜索词:真是
结果:
-content:真 -content:是
-----------------------------------
4.3.4 其它特使符号
如果形容"+-"为Lucene.Net的运算符的话,那只有这么两个也太单调了。实际上它还有其它运算符。
+-!():^[]{}~*?
上面的字符都是它的运算符号,这么多运算符用起来很方便。但是也就出现另外一个问题。
什么问题?下一节再讲。
相关文章推荐
- 模拟DLL加载
- Android 中的DisplayMetrics类的用法
- 适配器模式
- bootstrap
- Maven : 将Jar安装到本地仓库和Jar上传到私服
- js数组的操作
- Lucene.Net 2.3.1开发介绍 —— 四、搜索(一)
- iOS文件操作
- 认识自己——恐惧的奴隶3:妈妈
- 关于js调用ocx控件报错"对象不支持此属性或方法"的解决方法
- python中的深拷贝和潜拷贝
- Mac OS X (Intel) 上安装 Oracle 10g
- C#多线程与Unity中的使用
- Javascript常用功能
- 合并多个EXCEL工作簿
- [SQL入门级] 第一天 SQL初步
- python读取TXT到数组及列表去重后按原来顺序排序的方法
- IOS学习实例之五---三级控制器
- 对java抽象类的理解
- struts2学习笔记(4)---声明式异常