在Lucene中将数字范围查询与术语查询相结合

Chr*_*s J 12 java lucene

我想在Lucene中将数值范围查询与术语查询相结合.例如,我想搜索已编入索引的文档,其中包含10到20页,标题为"Hello World".

似乎不可能使用QueryParser为我生成此查询; QueryParser生成的范围查询似乎是文本查询.

我绝对会欣赏如何将数值范围查询与术语查询相结合的示例.我也会公开采取替代方法来搜索我的索引.

谢谢

Chr*_*s J 11

嗯,看起来我自己想出了这个.您可以将Query.combine()一起用于OR查询.我在下面列举了一个例子.

String termQueryString = "title:\"hello world\"";
Query termQuery = parser.parse(termQueryString);

Query pageQueryRange = NumericRangeQuery.newIntRange("page_count", 10, 20, true, true);

Query query = termQuery.combine(new Query[]{termQuery, pageQueryRange});
Run Code Online (Sandbox Code Playgroud)


Dr.*_*ins 5

您还可以创建自定义QueryParser重写protected Query getRangeQuery(...)方法,该方法应NumericRangeQuery"page_count"遇到字段时返回实例.

像这样......

public class CustomQueryParser extends QueryParser {

    public CustomQueryParser(Version matchVersion, String f, Analyzer a) {
        super(matchVersion, f, a);
    }

    @Override
    protected Query getRangeQuery(final String field, final String part1, final String part2, final boolean inclusive) throws ParseException {

        if ("page_count".equals(field)) {
            return NumericRangeQuery.newIntRange(field, Integer.parseInt(part1), Integer.parseInt(part2), inclusive, inclusive);
        }

        // return default
        return super.getRangeQuery(field, part1, part2, inclusive);    
    }
}
Run Code Online (Sandbox Code Playgroud)

然后CustomQueryParser在解析文本查询时使用..

像这样......

...
final QueryParser parser = new CustomQueryParser(Version.LUCENE_35, "some_default_field", new StandardAnalyzer(Version.LUCENE_35));
final Query q = parser.parse("title:\"hello world\" AND page_count:[10 TO 20]");
...
Run Code Online (Sandbox Code Playgroud)

当然,这一切都假定NumericField(...).setIntValue(...)在将page_count值添加到文档时使用