Lucene使用布尔子句查询语法

时间:2015-12-24 10:10:36

标签: solr lucene

我在Lucene有两个字段

  1. type(可包含X,Y,Z等值)
  2. 日期(包含2015-18-10等值)
  3. 我想写下面的查询:(type = X and date=today's data) OR (type = anything except X). 如何使用SHOULD,MUST,MUST_NOT编写此查询?看起来这些类型的查询没有子句。

2 个答案:

答案 0 :(得分:1)

您可以使用*:* -type:X来表达后一部分,因为这会创建所有文档的集合,然后减去具有type:X的文档集。 *:*查询在代码中表示为MatchAllDocsQuery

答案 1 :(得分:1)

如果我遇到了您的问题,我认为解决方案只是 BooleanQuery 的某种组合,以下是用 Scala 编写的代码来解决此问题。

根据文档(在BooleanClause.java中),应谨慎使用MUST_NOT。

  

将此运算符用于不得出现在匹配文档中的子句。请注意,无法搜索仅包含MUST_NOT子句的查询。

  object LuceneTest extends App {

     val query = new BooleanQuery

     val subQuery1 = new BooleanQuery
     subQuery1.add(new TermQuery(new Term("type", "xx")), BooleanClause.Occur.MUST)
     subQuery1.add(new TermQuery(new Term("date", "yy")), BooleanClause.Occur.MUST)

     val subQuery2 = new BooleanQuery
     // As mentioned above, so I put MatchAllDocsQuery here to avoid only containing MUST_NOT
     subQuery2.add(new MatchAllDocsQuery, BooleanClause.Occur.MUST)  
     subQuery2.add(new TermQuery(new Term("type", "xx")),BooleanClause.Occur.MUST_NOT)

     // subQuery1 and subQuery2 construct two subQueries respectively 
     // then use OR(i.e SHOULD in Lucene) to combine them 
     query.add(subQuery1, BooleanClause.Occur.SHOULD)
     query.add(subQuery2, BooleanClause.Occur.SHOULD)
     query

  }

无论如何,希望它有所帮助。