2011-03-23 63 views
2

我需要从字符串中提取单个词语以使用BooleanQuery构建查询。 我使用QueryParser.parse()方法吧,这是我的代码片段:Lucene:通过标记字符串构建查询并通过

booleanQuery.add(
    new QueryParser(
      org.apache.lucene.util.Version.LUCENE_40, 
      "tags", 
      new WhitespaceAnalyzer(org.apache.lucene.util.Version.LUCENE_40) 
    ).parse("tag1 tag2 tag3"), 
    BooleanClause.Occur.SHOULD); 

我不过想如果这是一个方面传递给booleanQuery正确的方法。

QueryParser.parse方法返回一个SrndQuery对象,我直接传递给booleanQuery.add()方法。

不确定这是否正确。我是否应该从SrndQuery或其他类似的东西中提取单个术语,并且多次调用booleanQuery.add()

更新:打印查询

*.*:*.* title:Flickrmeetup_01 description:Michael description:R. description:Ross tags:rochester tags:ny tags:usa tags:flickrmeetup tags:king76 tags:eos350d tags:canon50mmf14 tags:mikros tags:canon tags:ef tags:50mm tags:f14 tags:usm tags:canonef50mmf14 tags:canonef50mmf14usm 

回答

1

我相信你应该提取令牌,包裹每一个在一个期限,然后为它创建一个TermQuery,那么TermQuery添加到BooleanQuery。无论如何,SrndQuery是抽象的,所以我猜你当前的代码会创建一个子类的实例,这可能不是你的意思。您可能想为此创建自己的自定义QueryParser。

+0

以及我建议打印查询,这是结果..显然它的工作原理:相同的字段重复每个术语。但是,请你能看看打印的查询(添加到问题中)并让我知道我是否正确? – aneuryzm 2011-03-23 10:58:17

+0

@帕特里克 - 看起来不错。我不喜欢全球部分(。:*。*) - 这可能会伤害到性能。我建议你检查一下结果集,看看你是否能得到你想要的结果,并检查性能。 – 2011-03-23 11:07:13

+0

好吧,我想这个。:*。*是因为MatchAllDocsQuery – aneuryzm 2011-03-23 11:36:12