Это никогда ничего не будет совпадать, потому что логический запрос содержит только отрицательные предложения:
BooleanQuery.Builder builder = new BooleanQuery.Builder();
for (Query qu : queries) {
builder.add(qu, BooleanClause.Occur.MUST_NOT);
}
return builder.build();
Это довольно странно, но именно так работает Lucene, и вы используете низкоуровневый API Lucene, когда вы вы используете BooleanQuery.Builder
.
Solution # 1
Если вы хотите избежать такого сюрприза в будущем, убедитесь, что в вашем запросе всегда есть положительные предложения. Например, выполните рефакторинг своего кода, чтобы добавить предложение «MUST_NOT» в логический запрос верхнего уровня:
// Main code
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(queryBuilder.keyword().fuzzy().withEditDistanceUpTo(1).onField("establishmentNameEn").matching(word).createQuery(), BooleanClause.Occur.MUST);
builder.add(excludedDoc(queryBuilder), BooleanClause.Occur.MUST_NOT);
private org.apache.lucene.search.Query excludedDoc(QueryBuilder queryBuilder) {
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(queryBuilder.keyword().onField("IsTelPublishDa").matching(0).createQuery(), BooleanClause.Occur.SHOULD);
builder.add(queryBuilder.keyword().onField("isTelSecret").matching(1).createQuery(), BooleanClause.Occur.SHOULD);
return builder.build();
}
Решение # 2
В качестве альтернативы, вы можете просто сохранить свой код как есть, но используйте Hibernate Search DSL вместо BooleanQuery.Builder
. DSL Hibernate Search «исправляет» некоторые из наиболее запутанных аспектов Lucene, поэтому этот запрос будет работать должным образом (для всех документов, кроме тех, которые соответствуют пунктам):
BooleanJunction<?> booleanJunction = queryBuilder.bool();
for (Query qu : queries) {
booleanJunction.mustNot(qu);
}
return booleanJunction.createQuery();
Подробнее ...
Если вы хотите узнать, почему именно это не работает ...
Булевы запросы не будут ничего совпадать по умолчанию, если только (положительное) предложение не соответствует документу, в этом случае соответствие документы будут отфильтрованы на основе других (положительных или отрицательных) предложений.
Таким образом, в вашем случае запрос ничего не соответствует, а затем он отфильтровывается с помощью предложений "не должен", поэтому он по-прежнему ничего не соответствует.
Простое добавление предложения MatchAllDocs
сделает его работу ожидаемой:
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST);
for (Query qu : queries) {
builder.add(qu, BooleanClause.Occur.MUST_NOT);
}
return builder.build();