我正在構建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]
爲什麼你需要將值轉換爲具體的數據類型? 您可以將它們保留爲字符串。 – Lital
如果我不轉換或保留它的字符串,那麼它會在結果中拋出異常。數據類型不匹配。 –
請發佈您的異常,也許您需要在編制索引之前配置您的索引。 – Lital