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)

时间: 2024-08-01 13:23:52

Lucene:QueryParser中操作符的疑惑的相关文章

ios-iOS的GCD中的一点疑惑,求大神详解

问题描述 iOS的GCD中的一点疑惑,求大神详解 dispatch_queue_create(""队列名"",0),这个队列名有什么作为,创几个线程这个队列名,不管一样不一样,作用都一样 解决方案 ios-GCD详解iOS-GCD多线程编程详解5IOS GCD的使用详解

C++中操作符重载的const与默认构造函数

问题描述 C++中操作符重载的const与默认构造函数 原代码 class TestOverloadLessThan { public: TestOverloadLessThan( int m ) : m_int(m){}; int getInt(){ return m_int;}; bool operator<( const TestOverloadLessThan& t) const { return ( this->getInt() < t.getInt() ); }; p

对c++多线程编程中信号量的疑惑,求解

问题描述 对c++多线程编程中信号量的疑惑,求解 最近在写多线程,使用到信号量,对于信号量创建.释放createsemaphore和releasesemaphore中的初始资源数.最大并发数.计数增加个数不解,之前有用过,但都没有深入了解以至于现在模糊不清,最大并发数是指什么线程的最大并发数,自己线程or其他线程?增加的计数如果是2,是不是就相当于调用了两次waitfor函数?恳请熟悉这方面的朋友能给一个更为细致具体的讲解,小女不胜感激 解决方案 信号量就是限制同时只有1个或多个线程能够运行,数

netty 同步-关于Netty在项目中的使用-疑惑!

问题描述 关于Netty在项目中的使用-疑惑! 各位好, 小弟有一事不明,请大拿们指点一二! 我想实现一个交易框架,使用netty实现,netty是基于事件的NIO框架,用它做为ServerSocket来处理客户请求,但客户方是用传统的同步BIO来实现的,就是通过socket.connect()这种方式连接到我的netty serverSokcet上来,netty不会保留connection,读完数据就把channel关闭了,connection自然也就不存在了,但client端是同步的需要等待

asp.net中操作符简单介绍

c#中操作符重载:  代码如下 复制代码 class Test { public static Test operator + (Test arg1,Test arg2){...} } 虽然CLR对操作符一无所知,但它却规范了编程语言应该怎样提供操作符重载,以使它们可以很容易地被不同的编程语言编写的代码所使用,每个编程语言自己决定是否支持操作符重载,以及如果提供,表达和使用它们的语法是怎样的,对于CLR来讲,操作符重载仅仅是一些方法而已. 当编辑如果代码时,编辑器会产生一个名为op_Additi

RxJava中操作符到底做了什么?

RxJava今年彻底火了一把,其中最牛逼之处就是操作符了,以前只知道怎么用,这几天看了看源码,大致的弄清楚了操作符的工作过程,今天分享给大家.如果有什么不对地方,请大家多多指教. 今天我们已filter为例,看代码: Integer[] datas={1,2,3,4,5,6,7,8,9,10};  Observable.from(datas)          .filter(new Func1<Integer, Boolean>() {              @Override     

php中操作符与迭代整理

10.操作符 10.1 算术操作符 算术操作符通常用于整型或双精度类型的数据.如果将它们应用于字符串,PHP会试图将这些字符串转换成一个数字.如果其中包含"e"或"E"字符,它就会被当作是科学表示法并被转换成浮点数,否则将会被转换成整数.PHP会在字符串开始处寻找数字,并且使用这些数字作为该字符串的值,如果没找到数字,该字符串的值则为0. 10.2 字符串操作符 可以使用字符串连接操作符将两个字符串连接起来生成并保存到一个新字符串中. $a = "Bob'

react native 中 ... 操作符的主要用途

延展操作符(Spread operator) 这个 - 操作符(也被叫做延展操作符 - spread operator)已经被 ES6 数组 支持.它允许传递数组或者类数组直接做为函数的参数而不用通过apply. var people=['Wayou','John','Sherlock']; //sayHello函数本来接收三个单独的参数人妖,人二和人三 function sayHello(people1,people2,people3){ console.log(`Hello ${people

JAVA中BigDecimal的疑惑

问题描述 在做四舍五入的时候遇到个问题,如下代码块,得出的结果是5.55,ROUND_HALF_UP在API上不是讲---((向"最接近的"数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式.如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同:否则舍入行为与 ROUND_DOWN 相同.注意,这是我们大多数人在小学时就学过的舍入模式. ))为什么结果不是5.56?还请老鸟不吝啬赐教啊,谢谢了.BigDecimal b = new BigDecimal(5