上一篇文章讲了ApanTermQuery的用法,接下来继续:
SpanFirstQuery:
Term t1 = new Term( " content " , " david " );
SpanTermQuery query1 = new SpanTermQuery(t1);
System.out.println( " 将Span的值设为3: " );
SpanFirstQuery query = new SpanFirstQuery(query1, 3 );
Hits hits = searcher.search(query);
for ( int i = 0 ;i < hits.length();i ++ )
{
System.out.println( " ============ " );
System.out.println(hits.doc(i));
System.out.println( " ------------ " );
}
注:构建SpanFirstQuery对象时,传入的参数不是一个词条Term,而是一个SpanTermQuery的对象实例。3表示从first开始到第3个位置内是否有要检索的内容。
SpanNearQuery:
注意到定义“将Slop定义为2时,要重新写变量,必须吗?不需要要的。看看下面这个实例:
Term t1 = new Term( " content " , " david " );
Term t2 = new Term( " content " , " beautiful " );
SpanTermQuery query1 = new SpanTermQuery(t1);
SpanTermQuery query2 = new SpanTermQuery(t2);
System.out.println( " 将Slop的值设为3: " );
SpanNearQuery query = new SpanNearQuery( new SpanQuery[]{query1,query2}, 3 , false );
Hits hits = searcher.search(query);
for ( int i = 0 ;i < hits.length();i ++ )
{
System.out.println( " ============ " );
System.out.println(hits.doc(i));
System.out.println( " ------------ " );
}
System.out.println( " 将Slop的值设为2: " );
query = new SpanNearQuery( new SpanQuery[]{query1,query2}, 1 , false );
hits = searcher.search(query);
for ( int i = 0 ;i < hits.length();i ++ )
{
System.out.println( " ============ " );
System.out.println(hits.doc(i));
System.out.println( " ------------ " );
}
我原来是重新定义SpanNearQuery及后面的Hits但是太麻烦了,就用了下面的方法:
query = new SpanNearQuery( new SpanQuery[]{query1,query2}, 1 , false );
hits = searcher.search(query);
for ( int i = 0 ;i < hits.length();i ++ )
{
System.out.println( " ============ " );
System.out.println(hits.doc(i));
System.out.println( " ------------ " );
}
是不是特简单啊,省得麻烦!
其实SpanNearQuery与PhraseQuey有异曲同工之妙,发现了吧!
复杂点的例子(混合SpanNearQuery)
Document doc1 = new Document();
Field f1 = new Field( " content " , " aa bb cc dd ee ff gg hh ii jj kk " ,
Field.Store.YES, Field.Index.TOKENIZED);
doc1.add(f1);
writer.addDocument(doc1);
writer.close();
IndexSearcher searcher = new IndexSearcher(path);
// 创建四个词条
Term t1 = new Term( " content " , " aa " );
Term t2 = new Term( " content " , " cc " );
Term t3 = new Term( " content " , " gg " );
Term t4 = new Term( " content " , " kk " );
// 创建四个SpanTermQuery
// SpanTermQuery的功能与TermQuery一样,只不过是把文档中数据源中的词语位置都标记下来了
SpanTermQuery s1 = new SpanTermQuery(t1);
SpanTermQuery s2 = new SpanTermQuery(t2);
SpanTermQuery s3 = new SpanTermQuery(t3);
SpanTermQuery s4 = new SpanTermQuery(t4);
// 先创建两个SpanNearQuery,参数为上面的四个SpanTermQuery
// SpanNearQuery的功能与PhraseQuery的功能类似,只不过PharseQuery查询的是具有一定无关
// 单词长度的查询,而SpanNearQuery所匹配不一定是短语,它还有可能把SpanQuery的查询结果作为查询
// 对象。下面的构造函数:第二个参数相当于坡度slop,规定查询数据源的第一个必须出现查询的对象,
// 第三个参数false,表示要查询的多个词组是否要按照顺序出现在数据源中
SpanNearQuery query1 = new SpanNearQuery( new SpanQuery[] { s1, s2 }, 1 ,
false );
SpanNearQuery query2 = new SpanNearQuery( new SpanQuery[] { s3, s4 }, 3 ,
false );
// 在创建一个SpanNearQuery,参数为上面两个SpanNearQuery
// 意义就是在以上两个SpanNearQuery的搜索的结果中,进行搜索
SpanNearQuery query3 = new SpanNearQuery( new SpanNearQuery[] { query1, query2 }, 3 , false );
Hits hits = searcher.search(query3);
for ( int i = 0 ; i < hits.length(); i ++ )
{
System.out.println(hits.doc(i));
}
searcher.close();
形象图解如下:我不会弄啊!
aa bb cc dd ee ff gg hh ii j kk
SpanNearQuery SpanNearQuery
SpanNearQuery
SpanOrQuery与SpanNotQuery那就太简单了在上面的例子中加入如下两行即可
SpanOrQuery query4 = new SpanOrQuery( new SpanQuery[] { query1, query2 });
// SpanNotQuery意思是从第一个SpanQuery的查询结果中去掉第二个SpanQuery的查询结果
SpanNotQuery query5 = new SpanNotQuery(query1, query2);