У меня есть несколько случаев для поиска elasti c, но работает только первый - PullRequest
0 голосов
/ 28 марта 2020

Я поделился сценарием, выдавшим ошибку. Это соответствует только первому случаю, а не остальным

 BoolQueryBuilder boolqueryBuilder = new BoolQueryBuilder();
 boolqueryBuilder
            .should(QueryBuilders.matchPhrasePrefixQuery("dishName", (userSearchCriteriaContainer.getSearchString() == null ? "" : userSearchCriteriaContainer.getSearchString())))
            .should(QueryBuilders.termQuery("cuisineTypes", String.valueOf(userSearchCriteriaContainer.getCuisineTypes())) )
            .should(QueryBuilders.termQuery("mealType", String.valueOf(userSearchCriteriaContainer.getDishList())) )
            .should(QueryBuilders.termQuery("preparationTime", String.valueOf(userSearchCriteriaContainer.getPreparationTime())) );

 SearchRequest searchRequest = config.client().prepareSearch("dishes").setQuery(boolqueryBuilder).setExplain(true).setFrom(0).setSize(100).request();

 org.elasticsearch.action.search.SearchResponse response = null;
    try {
        response = config.restClient().search(searchRequest, RequestOptions.DEFAULT);
    } catch (IOException e) {

        e.printStackTrace();
    }

1 Ответ

0 голосов
/ 29 марта 2020

Когда нет 'must', 'should' должно соответствовать условию.

Вы можете добавить его в конец (.minimumShouldMatch (2))

Как минимум два условия.

boolqueryBuilder
        .should(QueryBuilders.matchPhrasePrefixQuery("dishName", (userSearchCriteriaContainer.getSearchString() == null ? "" : userSearchCriteriaContainer.getSearchString())))
        .should(QueryBuilders.termQuery("cuisineTypes", String.valueOf(userSearchCriteriaContainer.getCuisineTypes())) )
        .should(QueryBuilders.termQuery("mealType", String.valueOf(userSearchCriteriaContainer.getDishList())) )
        .should(QueryBuilders.termQuery("preparationTime", String.valueOf(userSearchCriteriaContainer.getPreparationTime())) )
        .minimumShouldMatch(2);
...