zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    webdriver学习
    [Sqlite]-->Java使用jdbc连接Sqlite数据库进行各种数据操作的详细过程(转)
    java 二维码
    java 解析json超大文件(转)
    嵌套三目运算符
    实体的字段以is开头的教训
    easyui中formatter的使用
    springmvc中的controller是单例的
    hibernate 中baseservice中添加事物
    easyui中添加富文本编辑器
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1025166.html
Copyright © 2011-2022 走看看