3

我正在構建API。在elasticsearch中我有id,name,price。客戶端爲我提供輸入json和要應用的過濾器。Elasticsearch動態過濾器構建

輸入1:以下用戶被過濾與ID = 1(整數)記錄

{ 
    "filters": { 
     "id":1 
    } 

} 

輸入2:用於處理輸入用戶正在查詢與城市記錄=東京

​​

Java代碼和查詢到彈性搜索

 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())); 
      } 


     } 

對於過濾器接收到的每個關鍵,我檢查的數據類型的輸入值。

我想支持所有列。我想要一個通用的解決方案,而不檢查輸入數據類型。

輸入3:

{ 
     "filters": { 
      "city":"tokyo", 
      "id":3, 
      "price":134.45 
     } 

} 

沒有任何處理的每個字段VS它們的數據類型,我想在與Java API elasticsearch查詢上述過濾器。我會怎麼做?

更新:

嘗試所有的字符串參數發送到彈性搜索,得到的異常

SearchParseException[[project][4]: from[-1],size[-1]: Parse Failure [Failed to parse source [{"query":{"filtered":{"filter":{"and":{"filters":[{"term":{"id":"\"1\""}}]}}}}}]]]; nested: NumberFormatException[For input string: ""1""]; } 
    at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction.onFirstPhaseResult(TransportSearchTypeAction.java:233) ~[elasticsearch-1.4.1.jar:na] 
    at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction$1.onFailure(TransportSearchTypeAction.java:179) ~[elasticsearch-1.4.1.jar:na] 
    at org.elasticsearch.search.action.SearchServiceTransportAction$23.run(SearchServiceTransportAction.java:565) ~[elasticsearch-1.4.1.jar:na] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.7.0_60] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.7.0_60] 
+0

爲什麼你需要將值轉換爲具體的數據類型? 您可以將它們保留爲字符串。 – Lital

+0

如果我不轉換或保留它的字符串,那麼它會在結果中拋出異常。數據類型不匹配。 –

+0

請發佈您的異常,也許您需要在編制索引之前配置您的索引。 – Lital

回答

1

低於當您使用termFilter爲FilterBuilder你不需要明確指定的值,因爲這支持所有基本的原始Java類型,如(float,int,long,string,object)。所以只需使用FilterBuilders.termFilter(key,ele.getValue())和apache lucene引擎來處理類型。

+0

我是否需要爲此配置任何彈性搜索?我試過這個,但拋出異常的數據類型 –

+0

我已經更新了我的問題,除了我在傳遞字符串中的id查詢 –

+0

「」1「」輸入的額外引號使lucene很難轉換爲它知道的數據類型關於。 – Jango