2015-02-11 81 views
2

我正在爲日期字段進行映射,如下所示。使用elasticsearch的日期篩選器,使用嵌套c#

.Date(s => s.Name("createdOn").Format("yyyy-MM-dd'T'HH:mm:ss.SSS||yyyy-MM-dd'T'HH:mm:ss||MM/dd/yyyy||yyyy/MM/dd")) 

我想在特定日期後創建文檔。我傳遞日期格式MM/DD/YYYY的過濾範圍字符​​串如下所示..

DateTime date; 
DateTime.TryParse(filter.SearchText, out date); 
string dateString = date.ToString("MM/dd/yyyy"); 
query = filterDesc.And(filterDesc.Range(n =>n.Greater(dateString).OnField(searchFields[filter.Field]))); 

但彈性搜索考慮時間也被搜索到。即我想要在2/10/2015之後創建文檔,我正在獲取也在2/10/2015上創建的文檔。請讓我知道可能的解決方案。

謝謝,並提前。

回答

3

基本上你想搜索在「2015/2/11 00:00」之後創建的文檔。下面的代碼應該工作我猜;雖然我沒有嘗試過。

DateTime date; 
DateTime.TryParse(filter.SearchText, out date); 
date = date.Date.AddDays(1); // date = floor(date) + 1 day 
string dateString = date.ToString("MM/dd/yyyy"); 
query = filterDesc.And(filterDesc.Range(n =>n.GreaterOrEquals(dateString).OnField(searchFields[filter.Field]))); 

你要知道,如果日期在文檔中其實也正是「2015年2月10日00:00」,該文件將不予退還如上面的查詢結果的一部分。這是因爲我們將日期轉換爲「2/11/2015 00:00」。但是如果你不想要這種行爲,你可以按照你的要求調整我的解決方案。

+2

至少在NEST 1.4.1中,日期相關範圍方法對格式有重載,如'n.GreaterOrEquals(date,「MM/dd/yyyy」)'。只是爲了幫助保持一點清潔。 – Snixtor 2015-02-11 21:31:46

+0

@Snixtor我已經完成了,如果你注意到。日期計算中的小複雜性是爲了滿足問題的要求。 – bittusarkar 2015-02-11 21:59:05

+0

@bsarkar我正在尋找'2/11/2015'之後創建的文檔。我嘗試了格式的重載方法。但仍然沒有運氣。作爲將日期設置爲'2015年11月2日23:59:59'的臨時修復,我正在獲取所需的文檔。 – 2015-02-12 06:26:14