2011-03-23 81 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