lucene-使用PhrasePrefixQuery和多个域上的查询

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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值