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

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -