Lucene';最小数量应匹配';解析失败

Lucene';最小数量应匹配';解析失败,lucene,Lucene,我使用org.apache.lucene.search.BooleanQuery.Builder创建简单的布尔查询 我还想使用minimumNumberShouldMatch来指定必须满足的可选布尔子句的最小数量: BooleanQuery.Builder builder = new BooleanQuery.Builder(); builder.add(new TermQuery(new Term("field", "value1")), BooleanClause.Occu

我使用
org.apache.lucene.search.BooleanQuery.Builder
创建简单的布尔查询

我还想使用minimumNumberShouldMatch来指定必须满足的可选布尔子句的最小数量:

    BooleanQuery.Builder builder = new BooleanQuery.Builder();

    builder.add(new TermQuery(new Term("field", "value1")), BooleanClause.Occur.SHOULD);
    builder.add(new TermQuery(new Term("field", "value2")), BooleanClause.Occur.SHOULD);
    builder.add(new TermQuery(new Term("field", "value3")), BooleanClause.Occur.SHOULD);

    builder.setMinimumNumberShouldMatch(2);

    String queryString = builder.build().toString();
    System.out.println(queryString);
因此,我得到以下查询字符串:

(field:value1 field:value2 field:value3)~2
如果至少有两个子句满足要求,我希望此查询返回文档


但我在解析此查询时遇到了一个问题:

new QueryParser(Version.LUCENE_7_7_1.toString(), new ClassicAnalyzer()).parse(queryString);
引发以下异常:

Exception in thread "main" org.apache.lucene.queryparser.classic.ParseException: Cannot parse '(field:value1 field:value2 field:value3)~2': Encountered " <FUZZY_SLOP> "~2 "" at line 1, column 40.
Was expecting one of:
    <EOF> 
    <AND> ...
    <OR> ...
    <NOT> ...
    "+" ...
    "-" ...
    <BAREOPER> ...
    "(" ...
    "*" ...
    "^" ...
    <QUOTED> ...
    <TERM> ...
    <PREFIXTERM> ...
    <WILDTERM> ...
    <REGEXPTERM> ...
    "[" ...
    "{" ...
    <NUMBER> ...

    at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:114)
    at ....lucene.common.BaseLuceneConnection.main(BaseLuceneConnection.java:101)
Caused by: org.apache.lucene.queryparser.classic.ParseException: Encountered " <FUZZY_SLOP> "~2 "" at line 1, column 40.
Was expecting one of:
    <EOF> 
    <AND> ...
    <OR> ...
    <NOT> ...
    "+" ...
    "-" ...
    <BAREOPER> ...
    "(" ...
    "*" ...
    "^" ...
    <QUOTED> ...
    <TERM> ...
    <PREFIXTERM> ...
    <WILDTERM> ...
    <REGEXPTERM> ...
    "[" ...
    "{" ...
    <NUMBER> ...

    at org.apache.lucene.queryparser.classic.QueryParser.generateParseException(QueryParser.java:931)
    at org.apache.lucene.queryparser.classic.QueryParser.jj_consume_token(QueryParser.java:813)
    at org.apache.lucene.queryparser.classic.QueryParser.TopLevelQuery(QueryParser.java:216)
    at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:109)
    ... 1 more
线程“main”org.apache.lucene.queryparser.classic.ParseException中的异常:无法分析“(字段:value1字段:value2字段:value3)~2”:在第1行第40列遇到“~2”。
我期待的是:
...
...
...
"+" ...
"-" ...
...
"(" ...
"*" ...
"^" ...
...
...
...
...
...
"[" ...
"{" ...
...
位于org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:114)
位于…lucene.common.BaseLuceneConnection.main(BaseLuceneConnection.java:101)
原因:org.apache.lucene.queryparser.classic.ParseException:在第1行第40列遇到“~2”。
我期待的是:
...
...
...
"+" ...
"-" ...
...
"(" ...
"*" ...
"^" ...
...
...
...
...
...
"[" ...
"{" ...
...
位于org.apache.lucene.queryparser.classic.queryparser.generateParseException(queryparser.java:931)
位于org.apache.lucene.queryparser.classic.queryparser.jj_消费_令牌(queryparser.java:813)
位于org.apache.lucene.queryparser.classic.queryparser.TopLevelQuery(queryparser.java:216)
位于org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:109)
…还有一个
我还尝试与Luke一起运行此查询,但得到了相同的错误

请告诉我,为什么这个查询不能被解析,尽管它是使用适当的工具构建的。

query.toString()
不是序列化的,不能保证传递回的查询可以被
QueryParser
解析。为了调试的目的,它旨在传回一些人类可读的东西

我不确定您在这里想要完成什么,因为您已经构建了完全可以接受的BooleanQuery,但是您应该永远不要做这样的事情:
QueryParser.parse(query.toString())

QueryParser不支持minimumNumberShouldMatch。请使用布尔查询进行搜索