跨度搜索SpanQuery【续】

上一篇文章讲了ApanTermQuery的用法,接下来继续:

SpanFirstQuery:

 

IndexSearcher searcher  =   new  IndexSearcher(path); 
                
                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时,要重新写变量,必须吗?不需要要的。看看下面这个实例:

 

IndexSearcher searcher  =   new  IndexSearcher(path); 
                
                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但是太麻烦了,就用了下面的方法:

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与PhraseQuey有异曲同工之妙,发现了吧!

复杂点的例子(混合SpanNearQuery)

 

IndexWriter writer  =   new  IndexWriter(path,  new  StandardAnalyzer(),  true ); 
                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(); 

形象图解如下:我不会弄啊!

                                                  Slop=3  

                    aa bb cc                dd ee ff                gg  hh  ii  j  kk

                    

                 SpanNearQuery                           SpanNearQuery

 

                                        SpanNearQuery

SpanOrQuery与SpanNotQuery那就太简单了在上面的例子中加入如下两行即可

SpanOrQuery是合并SpanQuery[]的搜索结果 
                    SpanOrQuery query4 
=   new  SpanOrQuery( new  SpanQuery[] { query1, query2 }); 

//                      SpanNotQuery意思是从第一个SpanQuery的查询结果中去掉第二个SpanQuery的查询结果 
                    SpanNotQuery query5  =   new  SpanNotQuery(query1, query2); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值