我试图从某个零售商处搜索最匹配的产品(赏金纸巾),我的查询如下,但查询返回0点击。
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;
我构建查询的方式有什么问题吗?
答案 0 :(得分:1)
多年前使用过Lucene,但让我试试......
重写您parse
部分,如下所示:
...
Query q1 = new QueryParser("product", new StandardAnalyzer())
.parse("bounty paper towel");
...
Query q2 = new QueryParser("retailer", new StandardAnalyzer())
.parse("Target"));
...
因此,您的查询应该只包含目标信息,而不是列名称 - 因为它之前已经被引用过。
答案 1 :(得分:1)
你正在逃避你不想逃避的事情。您将字符串“product:bounty paper towel”传递给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
也没有错。