默认的根据关键词检索段落是在所有书籍中进行检索,高级检索向用户提供范围查询,用户可以手动选择需要查询的书籍。
建立索引时插入了StringField字段book,用以作检索时的判断标志。
StringField和TextField的区别:StringField默认不分词建立索引,TextField会对字段内容进行分词之后再索引。
lucene提供一个Query的抽象类来定义查询。由于查询是和具体的使用环境相关的,所以具有新特点的Query类型可能会不断的添加到系统中,这部分的设计应该较多的考虑扩展的需要。
public static Query createQuery(boolean isCh, String keyword, String book) throws ParseException {
BooleanQuery query=new BooleanQuery();
if (isCh)
query.add(chParser.parse(keyword), BooleanClause.Occur.MUST);
else
query.add(engParser.parse(keyword), BooleanClause.Occur.MUST);
if (book.length() > 0){
String[] list = book.split(",");
BooleanQuery query1 = new BooleanQuery();
for(String s : list){
int i = Integer.parseInt(s);
query1.add(new TermQuery(new Term("book", books[i-1])), BooleanClause.Occur.SHOULD);
System.out.println(books[i-1]);
}
query.add(query1, BooleanClause.Occur.MUST);
}
return query;
}
Occur.MUST:必须满足此条件,相当于and
Occur.SHOULD:应该满足,但是不满足也可以,相当于or
Occur.MUST_NOT:必须不满足。相当于not
CreateQuery方法中传入要检索的关键词和书籍列表,书籍以String形式存储,书籍id之间以“,”间隔分开。
由于BooleanQuery中所有query只能同时是Occur.MUST/Occur.SHOULD/Occur.MUST_NOT,书籍之间是or的关键,而书籍和关键词之间是and的关系,因此需要创建两个BooleanQuey,最后将两个Query合到一起返回。