天天看点

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)

继续阅读