Lucene搜索2个字段

时间:2016-03-15 17:20:26

标签: lucene

我试图从某个零售商处搜索最匹配的产品(赏金纸巾),我的查询如下,但查询返回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;

我构建查询的方式有什么问题吗?

2 个答案:

答案 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也没有错。