java - Dynamic Filter Building in Elasticsearch -
i building api. have id,name,price in elasticsearch. client provides me input json filters applied.
input 1: below user filtering records id=1 (integer)
{ "filters": { "id":1 } }
input 2: user querying records city=tokyo
{ "filters": { "city":"tokyo" } }
java code handling inputs , querying elastic search
filters = ipjson.path("filters"); iterator<entry<string, jsonnode>> ite = filters.fields(); while (ite.hasnext()) { entry<string, jsonnode> ele = ite.next(); string key = ele.getkey(); if (ele.getvalue().isint()) { andfilter.add(filterbuilders.termfilter(key, ele.getvalue().asint())) } else if (ele.getvalue().istextual()) { andfilter.add(filterbuilders.termfilter(key, ele.getvalue().textvalue())); } }
for each key received in filters, checking data type of input value.
i want support columns. want generic solution without checking input data type.
input 3:
{ "filters": { "city":"tokyo", "id":3, "price":134.45 } }
without handling each field vs data type, want query above filters in elasticsearch java api. how that?
update:
trying send string parameters elastic search, getting below exception
searchparseexception[[project][4]: from[-1],size[-1]: parse failure [failed parse source [{"query":{"filtered":{"filter":{"and":{"filters":[{"term":{"id":"\"1\""}}]}}}}}]]]; nested: numberformatexception[for input string: ""1""]; } @ org.elasticsearch.action.search.type.transportsearchtypeaction$baseasyncaction.onfirstphaseresult(transportsearchtypeaction.java:233) ~[elasticsearch-1.4.1.jar:na] @ org.elasticsearch.action.search.type.transportsearchtypeaction$baseasyncaction$1.onfailure(transportsearchtypeaction.java:179) ~[elasticsearch-1.4.1.jar:na] @ org.elasticsearch.search.action.searchservicetransportaction$23.run(searchservicetransportaction.java:565) ~[elasticsearch-1.4.1.jar:na] @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1142) ~[na:1.7.0_60] @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:617) ~[na:1.7.0_60]
when use termfilter filterbuilder dont need specify values explicitly supports basic primitive java types such (float,int,long,string,object). use filterbuilders.termfilter(key, ele.getvalue()) , apache lucene engine takes care of type.
Comments
Post a Comment