Как использовать условия запроса в пользовательском упругом поисковом запросе Java? - PullRequest
0 голосов
/ 13 марта 2019

Я хочу найти поле по массиву значений в упругом поиске.Я пишу запрос пользовательских терминов в Java, но каждый раз он не работает.

Код -

@Query("{ \"bool\" : { \"must\" : [\t{ \"term\" : {\"userId\" : ?0 } },\t{ \"terms\" : { \"language\" : ?1 } } ] } }")
List<PostElastic> findByProviderIdAndLanguagesPostOrderLessThanFromId(Long providerId, List<String> languages, Long fromTimestamp,Pageable pageable);

Я получаю следующее исключение, когда передаю любое значение для поля языка

java.io.IOException: Unrecognized token 'en': was expecting ('true', 'false' or 'null')
at [Source: [B@20502fa2; line: 1, column: 86]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1702) ~[jackson-core-2.9.6.jar:2.9.6]
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:558) ~[jackson-core-2.9.6.jar:2.9.6]
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidToken(UTF8StreamJsonParser.java:3528) ~[jackson-core-2.9.6.jar:2.9.6]
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2686) ~[jackson-core-2.9.6.jar:2.9.6]
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:878) ~[jackson-core-2.9.6.jar:2.9.6]
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:772) ~[jackson-core-2.9.6.jar:2.9.6]
at org.elasticsearch.common.xcontent.json.JsonXContentParser.nextToken(JsonXContentParser.java:55) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.index.query.TermsQueryBuilder.parseValues(TermsQueryBuilder.java:391) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.index.query.TermsQueryBuilder.fromXContent(TermsQueryBuilder.java:356) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.search.SearchModule.lambda$registerQuery$10(SearchModule.java:763) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.common.xcontent.NamedXContentRegistry.parseNamedObject(NamedXContentRegistry.java:143) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.common.xcontent.support.AbstractXContentParser.namedObject(AbstractXContentParser.java:402) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.index.query.QueryParseContext.parseInnerQueryBuilder(QueryParseContext.java:122) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.index.query.BoolQueryBuilder.fromXContent(BoolQueryBuilder.java:356) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.search.SearchModule.lambda$registerQuery$10(SearchModule.java:763) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.common.xcontent.NamedXContentRegistry.parseNamedObject(NamedXContentRegistry.java:143) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.common.xcontent.support.AbstractXContentParser.namedObject(AbstractXContentParser.java:402) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.index.query.QueryParseContext.parseInnerQueryBuilder(QueryParseContext.java:122) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.index.query.WrapperQueryBuilder.doRewrite(WrapperQueryBuilder.java:167) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.index.query.AbstractQueryBuilder.rewrite(AbstractQueryBuilder.java:263) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.search.builder.SearchSourceBuilder.rewrite(SearchSourceBuilder.java:879) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.search.internal.ShardSearchLocalRequest.rewrite(ShardSearchLocalRequest.java:244) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.search.internal.ShardSearchTransportRequest.rewrite(ShardSearchTransportRequest.java:171) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.search.SearchService.createSearchContext(SearchService.java:530) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.search.SearchService.createContext(SearchService.java:479) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:461) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.search.SearchService.executeDfsPhase(SearchService.java:226) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.action.search.SearchTransportService$5.messageReceived(SearchTransportService.java:332) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.action.search.SearchTransportService$5.messageReceived(SearchTransportService.java:329) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:69) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.transport.TransportService$7.doRun(TransportService.java:662) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:675) ~[elasticsearch-5.6.10.jar:5.6.10]
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) ~[elasticsearch-5.6.10.jar:5.6.10]
... 3 common frames omitted

Я не могу использовать запрос термина, потому что размер массива является переменным, поэтому проверка для каждого элемента невозможна. Когда я запускаю запрос напрямую через упругий поиск с помощью почтальона, он работает.

Я пишу какой-либо неправильный запрос,Я не могу найти источники в Интернете

1 Ответ

1 голос
/ 14 марта 2019

В соответствии с документацией для аннотации @Query , вы должны добавить двойные кавычки самостоятельно, если планируете использовать параметр String:

Пример 54. Объявление запроса в методе с использованием аннотации @Query.

public interface BookRepository extends ElasticsearchRepository<Book, String> {
    @Query("{"bool" : {"must" : {"field" : {"name" : "?0"}}}}")
    Page<Book> findByName(String name,Pageable pageable);
}

Примечание : пример кода не корректно экранирует кавычки, я создал ДАННЫЕ-546 для решения этой проблемы.

Это также объясняет ошибку, которую вы получаете, потому что вы на самом деле отправляете {"language": en} вместо {"language": "en"}. И единственно возможные значения без кавычек: null, true или false (отсюда и сообщение об ошибке).

В вашем случае вы можете решить это с помощью:

@Query("{ \"bool\" : { \"must\" : [\t{ \"term\" : {\"userId\" : ?0 } },\t{ \"terms\" : { \"language\" : \"?1\" } } ] } }")
List<PostElastic> findByProviderIdAndLanguagesPostOrderLessThanFromId(Long providerId, List<String> languages, Long fromTimestamp,Pageable pageable);
...