2016-03-10 60 views
2

我正在通過instantsearch.js使用範圍滑塊實施搜索過濾器。
滑塊根據每個項目的year數據列過濾一系列年份。在這個數據庫中,有些項目沒有確切的一年,而是一個「假定的」時期,如「大約十八秒」或「1910年代末」。這意味着對於這些項目來說,過濾不是一年,而是多年。在同一商品上使用多個範圍值搜索

比方說,我希望過濾從1874年到1930年的範圍內的結果,並且在year字段中有一個「19世紀後半期」的項目。正如你可以說它應該導致匹配,因爲從1851年到1900年的任何一年是正確的這個項目。

我應該如何將這種類型的數據作爲此過濾器範圍的一部分? 我該如何構建此DB的year列中的數據?

我應該在algolia javascript搜索中使用一些腳本邏輯,而不是使用構造數據或索引的特殊方式嗎?
我在想一個邏輯的,如:

「如果項目的價值不只是數字,將其轉換爲一系列的年 然後檢查這些年的範圍內可以與過濾器相匹配。在 滑塊」

我真的不能告訴如何做到這一點,它看起來有點麻煩,愚蠢的我需要的。我很確定在DB數據設計中這不是一個新問題,所以必須有一個正確的方法來解決它。

我試過四處搜尋,但我甚至不知道如何正確地說出這個東西,我問。如果你有編輯標題的建議,請告訴我!

我正在使用MySQL數據庫以及PHP。

回答

1

使用Algolia,您需要將此值轉換爲時間戳,然後您才能夠使用numericFilter並向您的用戶界面添加範圍滑塊或數字細化列表組件。

此屬性必須在您的索引配置中定義爲attributesForFaceting。

https://community.algolia.com/instantsearch.js/documentation/#rangeslider

https://community.algolia.com/instantsearch.js/documentation/#numericrefinementlist

+0

謝謝!你是否告訴我,我可以提供2列說明來搜索這些列值,並在滑塊內提供的值範圍內對它們進行過濾? – Gruber

+0

我在你的用例中挖了一下,不幸的是我們現在提供的範圍滑塊不允許你在同一個滑塊上使用2列。但好消息,小部件應該更新以允許修改。我們的團隊會看看它: https://github.com/instantsearch/instantsearch-ion.rangeSlider/issues/4 這是一個使用情況,使感謝,感謝報告它。 與此同時,您仍然可以使用2個滑塊(開始和結束日期)或數字優化列表。 – Shipow

+1

編輯:我們的團隊只是做了修改,請告訴我們它是否適合你! https://github.com/instantsearch/instantsearch-ion.rangeSlider/commits/master – Shipow

1

考慮您的year的範圍內,你可以添加一個begginingend屬性的字段。例如:

EventTimes

id SMALLINT NOT NULL PRIMARY, 
yearEnd DATETIME, 
yearStart DATETIME 

在這種情況下,端部和啓動將等於(I使用空端部),當該事件是一個特定的時間,並且成爲一個範圍時這兩個字段被填充。

SELECT ing時,您可以隨時檢查兩個字段,而不會顯着降低速度或準確性。然後檢查具體時間,時間範圍,或者如果事件開始,結束,重新開始,重新結束等,您可以檢查同一個表中的不同字段。

+0

感謝您的意見,這確實很有趣,可能是解決可能的模糊價值和如何將其存儲在數據庫中的最佳方法。我不明白'EventTimes'是什麼,它是存儲時間範圍的表的名字嗎?你建議與物品表有1-1關係? – Gruber

+0

EventTimes是表格的名稱。儘管根據我的需要,每個事件都有1個「時間」,但您可以使ID不是主要的,並且將該值作爲另一個表中的列的標識符,因此您可以使用1-N「times」作爲每個事件。 – Bonatti

+0

有趣的謝謝! 1-M表是一個有用的補充,但在我的情況下並不是真的需要,但你已經指出我如何處理數據庫中的數據的正確方向,不幸的是我只能+1 +1) – Gruber