2016-03-15 152 views
0

我試圖從某個零售商搜索最匹配的產品(賞金紙巾),我的查詢如下,但查詢返回0命中。Lucene搜索2字段

BooleanQuery.Builder combine = new BooleanQuery.Builder(); 

Query q1 = new QueryParser("product", new StandardAnalyzer()).parse(QueryParser.escape("product:" + "bounty paper towel")); 
combine.add(q1, BooleanClause.Occur.SHOULD); // find best name match 

Query q2 = new QueryParser("retailer", new StandardAnalyzer()).parse(QueryParser.escape("retailer:" + "Target")); 
combine.add(q2, BooleanClause.Occur.MUST); // Must from this retailer 

searcher.search(combine.build(), hitsPerPage).scoreDocs; 

這有什麼錯我構建查詢的方式嗎?

回答

1

你正在逃避你不想逃避的東西。您將字符串「product:bounty紙巾」傳遞給escape方法,該方法將逃離不想冒險的冒號。實際上,該查詢,逃避和分析後,看起來就像這樣:

產品:產品\:賞金產品:紙產品:毛巾

你應該逃脫搜索詞,而不是整個查詢。喜歡的東西:

parser.parse("product:" + QueryParse.escape("bounty paper towels")); 

此外,它看起來像你正在尋找一個短語查詢存在,在這種情況下,應該用引號引起來:

parser.parse("product:\"" + QueryParse.escape("bounty paper towels") + "\""); 

您構建布爾查詢的樣子精細。你可以利用查詢語法分析來完成同樣的事情,如果你願意的話,像這樣:

parser.parse(
    "product:\"" + QueryParse.escape("bounty paper towels") + "\"" 
    + "+retailer:" + QueryParse.escape("Target") 
); 

但同樣,有什麼不對BooleanQuery.Builder代替。

1

採用lucene太多年前,但讓我試試......

重寫你parse部分如下:

... 
Query q1 = new QueryParser("product", new StandardAnalyzer()) 
      .parse("bounty paper towel"); 
... 
Query q2 = new QueryParser("retailer", new StandardAnalyzer()) 
      .parse("Target")); 
... 

所以,你的查詢應該只包含目標信息,而不是列名 - 因爲它之前已經被引用。