如何在Apache Lucene中将PhraseQuery与RangeQuery结合使用?

时间:2018-10-19 14:33:48

标签: java lucene

基本上,我希望能够使用以下查询"phrase query" AND date:[20180101 TO 20181231]来查询索引。我尝试使用MultiFieldQueryParser,但遇到以下错误:

Exception in thread "main" java.lang.IllegalStateException: field "date" was indexed without position data; cannot run PhraseQuery

因此,我使用以下代码构造了查询:

final Query phraseQ = new QueryParser("text", Analyzer.CUSTOM)
        .parse(query);
final Query rangeQ = new QueryParser("date", Analyzer.CUSTOM)
        .parse(dateRange);

final Query q = new BooleanQuery.Builder()
        .add(phraseQ, BooleanClause.Occur.MUST)
        .add(rangeQ, BooleanClause.Occur.MUST)
        .build();

其中查询为"phrase query"~1,dateRange为date:[20180101 TO 20181231]。我仍然收到以下异常

Exception in thread "main" java.lang.IllegalStateException: field "date" was indexed without position data; cannot run PhraseQuery (phrase=date:"phrase query"~1)

尽管我不使用短语查询日期字段。

短语查询和范围查询是否全部可能?

1 个答案:

答案 0 :(得分:0)

MultiFieldQueryParser旨在搜索在查询中未指定字段时给出的所有字段列表中。所以,这:

MultiFieldQueryParser parser = new MultiFieldQueryParser(new String[] {"text","date"}, new StandardAnalyzer());
Query query = parser.parse("\"phrase query\" AND date:[20180101 TO 20181231]");

产生如下查询:

+(text:"phrase query" date:"phrase query") +date:[20180101 TO 20181231]

因此是问题。如果仅用标准“ QueryParser”(默认值为“文本”)替换它,它将产生所需的内容。


但是,就您提供的代码而言,它看起来还不错。尝试在解析之前打印dateRange的内容,确保它是您想要的。