2015-09-06 24 views
1

我使用Elasticsearch Java API爲搜索創建索引並編寫查詢。 索引是在各個領域創建的。其中一個字段是創建索引的數字(整數)。ElasticSearch [1.4.4]:使用非數字輸入的數值索引範圍搜索

現在我們得到的輸入是字符串的形式。我們必須搜索所有提供的輸入字段。要在數字字段搜索,我們使用

QueryBuilders.rangeQuery() method. 

但是當它遇到「到」或「發件人」字段,它拋出

SearchPhaseExecutionException[Failed to execute phase [query]. 
nested: NumberFormatException[For input string: \"30y\"] 

任何非整數值,我該如何避免這種情況?很好,我們沒有得到任何搜索結果,但我想避免這種異常,因爲可能會出現非整數輸入的情況。

另一個選項是檢查所有輸入令牌,我想避免它,因爲它會添加另一個會影響性能的檢查級別。

有什麼辦法可以做到這一點elasticsearch API

回答

1

另一個選擇是檢查所有輸入令牌,我想避免它,因爲它會添加另一個會影響性能的檢查級別。

檢查/驗證用戶輸入的東西,你應該總是,在任何情況下,無論您的性能要求。如果您不這樣做,則會不必要地將您的羣集暴露給未知的未知威脅,但也會導致最近已經造成一些損害的known ones,並且這會對您的羣集和/或業務造成比清理用戶輸入花費的毫秒更多的影響。 Elasticsearch是靈活的,可以創造奇蹟,但你也必須玩得很高興。這就是說,如果你真的想要避免secure coding best practices,你可以使用下面的查詢,如果輸入數據不符合要求,將不會吠叫。

{ 
    "query": { 
    "simple_query_string": { 
     "query": "numfield:[10y TO *]" 
    } 
    } 
} 

simple_query_stringquery_string等價,但更寬容與輸入,絕不會拋出異常。

+0

感謝您的有用信息[Val](http://stackoverflow.com/users/4604579/val)。我們最終決定在創建查詢之前檢查輸入。這樣可以節省我們撥打數據庫的費用,以補償檢查所需的時間。 –

+0

不錯,你採取了正確的方法;)這個簡單的驗證檢查肯定是值得的,的確如此! – Val