2012-10-17 35 views
1

我正在嘗試使用SolR和PHP實現一種酒店/旅館搜索。對於任何可用房間,我在索引中存儲一個新文檔,其中包含關於包含availableFrom和availableTill日期的住宿和多值屬性的相關信息。對SolR運行查詢以在特定時間範圍內獲得所有房間不應該那麼困難,但是在分類時我的大腦會緊張起來......SolR - 搜索房間可用性和結果排序

我的目標是不僅顯示可用住宿,而且顯示所有住宿它們與目的地(國家/城市/地區)上的常規過濾器查詢匹配,並對這些結果進行排序,以便將所有可用房間排序到列表的開頭。

因此,對於在慕尼黑的房間從12月1日至'12 12月5日的搜索,我想獲得這樣的結果:

  • 房A(提供)
  • 房B(可用)
  • 房C(不完全地在一定時期內獲得=>不錯的)
  • 室d(不可用在所有)

目前我運行SolR 3.6,但如果需要可以切換到新的4.0。

有沒有Solr-Guru對我有一些建議? 任何幫助表示讚賞:-)

CNC中

我覺得Samuele把我推在正確的方向。所以現在的問題是,如何創建一個函數查詢來按照可用性進行排序。也許有更好的方式來存儲我的文檔,即更改我的schema.xml?

下面是它豆蔻摘錄:

<field name="recordId" type="string" indexed="true" stored="true" /> 
<field name="language" type="int" indexed="true" stored="true" /> 
<field name="name" type="string" indexed="true" stored="false" /> 
<field name="maxPersons" type="int" indexed="true" stored="false" /> 
<field name="avgPrice" type="tdouble" indexed="true" stored="false" /> 
<field name="city" type="freetext" indexed="true" stored="false" /> 
<field name="district" type="freetext" indexed="true" stored="false" /> 
<field name="country" type="freetext" indexed="true" stored="false" />  
<field name="availableFrom" type="date" indexed="true" stored="true" multiValued="true" /> 
<field name="availableTill" type="date" indexed="true" stored="true" multiValued="true" /> 

乾杯 - 斯文

回答

1

好,你必須根據場上「房間」,以提高你的查詢(或可用性,取決於你)給出了基於價值不同的分數

簡單的例子:

讓我們給一個可用的房間20的提振,10部分提供升壓和不可用噓聲1日(只是要確定)

查詢(網址明智的,我不知道PHP接口SOLR)是需要像

<query>&bq=rooms:avail^20.0&bq=rooms:part-avail^10.0... 

建議:如果你使用dismax查詢處理程序,它是令人上癮的。這意味着你必須添加比一個更大的提升(2000年,而不是20爲例),因爲它增加了增壓值來查詢成績

也,你應該從Solr的wiki,它優於檢查this link任何解釋。

+0

這並不意味着我必須將文檔添加到我的索引中的任何可能的旅行日期嗎? 如上所述,每個房間都有一份文件,本文件包含每個可預訂期間的多個從/到期日期。 – Sven

+0

我不認爲,你首先運行你的正常查詢(在一定的時間範圍內的所有房間),然後你使用你的推進值排序參數。只需檢查我的代碼,我也是這樣做的:如果一個值出現在一個確定的字段中,那麼這個字段對它有很大的幫助。使用php(或python,在我的情況下)應該可以幫助您更好地優化查詢(例如:使用if語句來決定是否以及要增強什麼等) –

+0

運行初始查詢和篩選時間範圍只會顯示可用的房間。刪除此過濾器可能會導致返回非常大量的文檔。運行查詢時可以隨時創建「可用」字段並使用它來提高分數嗎?像「完全可用」^ 100「部分可用」^ 50「不可用」^ 1?或者是否可以讓SolR返回不匹配查詢的文檔?我覺得sortMissingLast在這裏可能會有所幫助... – Sven

0

那麼,我在這裏做了一些研究和測試...我的問題的正確和可能的最佳解決方案是對SolR執行多個查詢。正如Samuele所建議的那樣,我通過兩步來查詢與給定標準和時間跨度相匹配的所有住宿的SolR。

1:獲取所有房間匹配並且是可用的(包括部分可用客房) 2:獲取所有可用客房

第二查詢明明只有進行時,我們需要表現出更多的成果「分頁的COS 。

之後,後處理所有來自步驟1的結果,以確定它們是否在整個請求的時間範圍內可用。

進一步的「改進」是在模式中引入一個新字段:availableDay。對於每個可預訂的日子,該日期將會有一個條目。這會將第一個查詢拆分爲兩個單獨的查詢。這只是SolR額外濾波器的問題。

再次感謝您指點我正確的方向!