您的位置:首页 > 产品设计 > UI/UE

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

2009-12-24 17:58 621 查看
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));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: