基本上,我希望能够使用以下查询"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)
尽管我不使用短语查询日期字段。
短语查询和范围查询是否全部可能?
答案 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
的内容,确保它是您想要的。