我在Lucene有两个字段
我想写下面的查询:(type = X and date=today's data) OR (type = anything except X).
如何使用SHOULD,MUST,MUST_NOT编写此查询?看起来这些类型的查询没有子句。
答案 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
}
无论如何,希望它有所帮助。