2015-12-28 2 views
2

Я пытаюсь зарегистрировать запрос перколятора с помощью библиотеки flexible4s. После долгих исследований я обнаружил, что мне нужно использовать что-то вроде:Использование Elastic4s для регистрации запроса с перколятором

val myQuery = """ { "query" : { "match" : { "foo" : "bar" } } } """ 

esClient.execute(register id 12345 into "baz" query myQuery) 

Как будто я делаю это:

curl -XPUT 'localhost:9200/baz/.percolator/12345' -d '{ 
    "query" : { 
     "match" : { 
      "foo" : "bar" 
     } 
    } 
}' 

Но всякий раз, когда я пытаюсь работает esClient.execute я в конечном итоге получить несколько разбор ошибок, но он отлично работает через завиток:

[info] org.elasticsearch.index.percolator.PercolatorException: failed to parse query [987654] 
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry.parsePercolatorDocument(PercolatorQueriesRegistry.java:182) 
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry$RealTimePercolatorOperationListener.preIndex(PercolatorQueriesRegistry.java:301) 
[info] at org.elasticsearch.index.indexing.ShardIndexingService.preIndex(ShardIndexingService.java:146) 
[info] at org.elasticsearch.index.shard.IndexShard.index(IndexShard.java:565) 
[info] at org.elasticsearch.index.engine.Engine$Index.execute(Engine.java:836) 
[info] at org.elasticsearch.action.support.replication.TransportReplicationAction.executeIndexRequestOnPrimary(TransportReplicationAction.java:1073) 
[info] at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:170) 
[info] at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.performOnPrimary(TransportReplicationAction.java:579) 
[info] at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase$1.doRun(TransportReplicationAction.java:452) 
[info] at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) 
[info] ... 
[info] Cause: org.elasticsearch.index.query.QueryParsingException: Failed to parse query [{"query":{"match":{"foo":"bar"}}}] 
[info] at org.elasticsearch.index.query.QueryStringQueryParser.parse(QueryStringQueryParser.java:243) 
[info] at org.elasticsearch.index.query.QueryParseContext.parseInnerQuery(QueryParseContext.java:257) 
[info] at org.elasticsearch.index.query.IndexQueryParserService.parseInnerQuery(IndexQueryParserService.java:244) 
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry.parseQuery(PercolatorQueriesRegistry.java:208) 
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry.parsePercolatorDocument(PercolatorQueriesRegistry.java:179) 
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry$RealTimePercolatorOperationListener.preIndex(PercolatorQueriesRegistry.java:301) 
[info] at org.elasticsearch.index.indexing.ShardIndexingService.preIndex(ShardIndexingService.java:146) 
[info] at org.elasticsearch.index.shard.IndexShard.index(IndexShard.java:565) 
[info] at org.elasticsearch.index.engine.Engine$Index.execute(Engine.java:836) 
[info] at org.elasticsearch.action.support.replication.TransportReplicationAction.executeIndexRequestOnPrimary(TransportReplicationAction.java:1073) 
[info] ... 
[info] Cause: org.apache.lucene.queryparser.classic.ParseException: Cannot parse '{"query":{"match":{"foo":"bar"}}}': Encountered " "}" "} "" at line 1, column 30. 
[info] Was expecting one of: 
[info]  "TO" ... 
[info]  <RANGE_QUOTED> ... 
[info]  <RANGE_GOOP> ... 
[info] at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:123) 
[info] at org.apache.lucene.queryparser.classic.MapperQueryParser.parse(MapperQueryParser.java:848) 
[info] at org.elasticsearch.index.query.QueryStringQueryParser.parse(QueryStringQueryParser.java:227) 
[info] at org.elasticsearch.index.query.QueryParseContext.parseInnerQuery(QueryParseContext.java:257) 
[info] at org.elasticsearch.index.query.IndexQueryParserService.parseInnerQuery(IndexQueryParserService.java:244) 
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry.parseQuery(PercolatorQueriesRegistry.java:208) 
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry.parsePercolatorDocument(PercolatorQueriesRegistry.java:179) 
[info] at org.elasticsearch.index.percolator.PercolatorQueriesRegistry$RealTimePercolatorOperationListener.preIndex(PercolatorQueriesRegistry.java:301) 
[info] at org.elasticsearch.index.indexing.ShardIndexingService.preIndex(ShardIndexingService.java:146) 
[info] at org.elasticsearch.index.shard.IndexShard.index(IndexShard.java:565) 
[info] ... 
[info] Cause: org.apache.lucene.queryparser.classic.ParseException: Encountered " "}" "} "" at line 1, column 30. 
[info] Was expecting one of: 
[info]  "TO" ... 
[info]  <RANGE_QUOTED> ... 
[info]  <RANGE_GOOP> ... 
[info] at org.apache.lucene.queryparser.classic.QueryParser.generateParseException(QueryParser.java:698) 
[info] at org.apache.lucene.queryparser.classic.QueryParser.jj_consume_token(QueryParser.java:580) 
[info] at org.apache.lucene.queryparser.classic.QueryParser.Term(QueryParser.java:394) 
[info] at org.apache.lucene.queryparser.classic.QueryParser.Clause(QueryParser.java:247) 
[info] at org.apache.lucene.queryparser.classic.QueryParser.Query(QueryParser.java:171) 
[info] at org.apache.lucene.queryparser.classic.QueryParser.TopLevelQuery(QueryParser.java:160) 
[info] at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:118) 
[info] at org.apache.lucene.queryparser.classic.MapperQueryParser.parse(MapperQueryParser.java:848) 
[info] at org.elasticsearch.index.query.QueryStringQueryParser.parse(QueryStringQueryParser.java:227) 
[info] at org.elasticsearch.index.query.QueryParseContext.parseInnerQuery(QueryParseContext.java:257) 
[info] ... 

Так у меня есть ощущение, что мне нужно форматировать запрос по-разному, но это не в документации, и я не могу найти какие-либо примеры там , Я попробовал несколько других форматов, как так:

val myQuery2 = """ "query" : { "match" : { "foo" : "bar" } } """ 
val myQuery3 = """ { "match" : { "foo" : "bar" } } """ 
val myQuery4 = """ "match" : { "foo" : "bar" } """ 

Но ничто не кажется, чтобы быть в состоянии работать, единственное, что я получил на работу только имея это нравится:

val myQuery5 = "query" 

Но с этим я не могу указать, на что я действительно хочу соответствовать. У кого-нибудь есть опыт с этим или какие-то идеи?

ответ

1

Метод query принимает строку, но строка query string, а не фрагмент json, как вы пробовали. Если формат строки запроса не подходит, то вам необходимо создать запрос, используя elastic4s DSL запроса, например

termQuery("field", "value") 

или

matchQuery("field", "value") 

и т.д. Есть много типов запросов, и они могут быть вложенный с помощью запроса bool.

Смежные вопросы