1、类PhrasePrefixQuery是一种可以适合于特殊应用的Query类型,但事实上这个类却有很多其他的用途。允许多个项对应于同一个位置,就像一个BooleanQuery对象可以对应于多个逻辑或的PhraseQuery子句一样。
public class PhrasePrefixQueryTest extends TestCase{
private IndexSearchersearcher;
protected void setUp()throws Exception{
RAMDirectory directory=new RAMDirectory();
IndexWriter writer=new IndexWriter(directory,newWhitespaceAnalyzer(),true);
Document doc1=new Document();
doc1.add(Field.Text("field","the quick brown fox jumped over thelazy dog"));
writer.addDocument(doc1);
Document doc2=new Document();
doc2.add(Field.Text("field","the fast fox hopped voer thehound"));
writer.addDocument(doc2);
writer.close();
searcher=new IndexSearcher(directory);
}
}
查找与speedyfoxes相关的文档,PhrasePrefixQuery匹配短语的方式与PhraseQuery非常相似,它们的区别是:PhrasePrefixQuery对象允许多个项对应于同一位置。跟使用BooleanQuery返回的命中集相同,但是BooleanQuery需要使用OR操作符
publicvoid testBasic() throws Exception{
PhrasePrefixQuery query=new PhrasePrefixQuery();
Query.add(newTerm[]{//以下2项是首先被匹配的
newTerm("field","quick"),
newTerm("field","fast")
});
query.add(new Term("field","fox"));//第二被匹配
Hitshits=searcher.search(query);
assertEquals("fastfox match",1,hits.length());
query.setSlop(1);
hits=searcher.search(query);
assertEquals("both match",2,hits.length());
}
支持slop因子
2、支持多个域查询
使用MultiFieldQueryParser实现多个域查询,但不考虑它们到底在哪个域。
public class MultiFieldQueryParserTest extends LiaTestCase{
public void testDefaultOperator() throwsException{//在fitle和subjects域对查询表达式"development"进行解析,查询结果中匹配的文档是基于title域或者subjects域匹配
Query query=MultiFieldQueryParser.parse("develop",newString[]{"title","subjects"},new SimpleAnalyzer());
IndexSearchersearcher=new IndexSearcher(directory);
Hits hits=searcher.search(query);
}
public void testSpecifiedOperator() throwsException{//查询结果匹配title和subjects,2个域都必须匹配
Query query=MultiFieldQueryParser.parse("development",new String[]{"title","subjects"},newint[]{MultiFieldQueryParser.REQUIRED_FIELD,MultiFieldQueryParser.REQUIRED_FIELD},newSimpleAnalyzer());
IndexSearcher searcher=new IndexSearcher(directory);
Hits hits=searcher.search(query);
}
}
MultiFieldQueryParser使用了QueryParser的静态parse()方法,不能修改QueryParser中提供的任何设置,如对本地化日期解析和零SLOP因子无法处理。
3、为用户输入表达式进行基于多个域的查询不是一个理想的方法。
更通用的做法是,通过合并各种不同的域方式,把欲搜索的词索引到contents域或keywords域。
使用空格把author和subject隔开以供分析器使用,允许用户在限制域的名称情况下任意输入查询文本
doc.add(Field.UnStored("contents",author+" "+subjects));