Lucene:QueryParser中操作符的疑惑
晚上在测试Lucene搜索时,对于 AND 与 + 的区别研究了下
索引库中有四条记录,分别是
no:300900002071 name:情侣装*休闲女装
no:300900002069 name:情侣装*休闲男装
no:400000480418 name:情侣完美坠
no:400000480155 name:天然翡翠项链
如果用以下字符串来搜索
(name:情侣) + (no:400000480155)
本来是想搜索出name中包含"情侣" 或 no为 400000480155 的记录,结果只有no为 400000480155的记录
如果改为
(name:情侣) AND (no:400000480155)
或
+(name:情侣) +(no:400000480155)
一条记录也没有
由这二组测试,可以看出AND与+,并不总是相等 (真是有点意外!)
如果改为
(name:情侣) OR (no:400000480155)
或
(name:情侣) (no:400000480155)
结果正常,即同时搜索出name中包含"情侣",或no为400000480155的记录
从这里可以看出OR与空格,作用相同
个人体会:
搜索时括号内的值,可以理解为一个变量,其前面可以加上"修饰"的操作符号: "+"或"-"号,表示必须包含,或不得包含
(name:情侣) + (no:400000480155) 与 (name:情侣) AND (no:400000480155)
为什么结果会不同?
对此又测试了一下
(no:400000480155) +(name:情侣) 这次的结果是只有name包含"情侣"的三条记录
(no:400000480155) AND (name:情侣) 仍然搜索不到记录
总结:
1。加号(+)和减号(-),仅仅只是对某单个查询条件的修饰,表示必须包含或不得包含
2。AND,OR, NOT才是表示多个文件之间的逻辑与,或,非
3。不用任何逻辑符号符(即AND,OR,NOT)时,多个条件放在一起,整个表达式的意义,就由带+号的条件共同决定(比如上面提到的 (no:400000480155) +(name:情侣) 和 (name:情侣) + (no:400000480155)),即(A +B +C最后就是相当于+B +C),如果多个条件前都没有修饰操作符(即+和-),则整个表达式的效果就是多个条件逻辑或(即A B 相当于A or B)
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。