1

SolRとPHPを使用して一種のホテル/ホステル検索を実装しようとしています。利用可能な部屋については、宿泊施設に関する関連情報を含む新しいドキュメントと、availableFromおよびavailableTill日付を含む複数値属性をインデックス内に保存します。SolRに対してクエリを実行して、特定の期間内にすべての部屋を取得するのはそれほど難しいことではありませんが、並べ替えに関しては頭がおかしくなります...

私の目標は、利用可能な宿泊施設だけでなく、目的地(国/都市/地区)の一般的なフィルタークエリに一致するすべての宿泊施設を表示し、これらの結果を並べ替えて、利用可能なすべての部屋がリストの先頭に並べ替えられるようにすることです。

したがって、2012年12月1日から12月5日までのミュンヘンの部屋を検索するには、次のような結果を取得したいと思います。

  • 部屋A(利用可能)
  • ルームB(利用可能)
  • 部屋C(指定された期間内に完全に利用可能ではありません=>ありがたいです)
  • ルームD(まったく利用できません)

現在、SolR 3.6を実行していますが、必要に応じて新しい4.0に切り替えることができます。

Solr-Guruに何か提案はありますか?助けていただければ幸いです:-)

-編集-

サミュエルは私を正しい方向に押しやったと思います。したがって、問題は、可用性で並べ替えることができる関数クエリを作成する方法です。たぶん、私のドキュメントを保存するより良い方法がありますか、つまり私の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" />

乾杯-スヴェン

4

2 に答える 2

1

さて、フィールド「部屋」(または空室状況はあなた次第)に基づいてクエリをブーストし、値に基づいて異なるスコアを与える必要があります

簡単な例:

利用可能な部屋には 20 のブースト、部分的に利用可能な部屋には 10 のブースト、利用できない部屋には 1 のブーストを与えましょう (念のため)。

あなたのクエリ(URLに関しては、solrへのphpインターフェースがわからない)には次のようなものが必要です

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

提案: dismax クエリ ハンドラーを使用している場合は、中毒性があります。これは、クエリ スコアにブースト値を追加するため、それよりも大きなブースト (たとえば、20 ではなく 2000) を追加する必要があることを意味します。

また、solr wiki からこのリンクを確認する必要があります。これは、どの説明よりも優れています。

于 2012-10-17T07:27:27.527 に答える
0

さて、私はここですべてについていくつかの調査とテストを行いました...私の問題に対する現在のそしておそらく最良の解決策は、SolRに対して複数のクエリを実行することです。Samueleが提案したように、2つのステップで、指定された基準と期間に一致するすべての宿泊施設についてSolRにクエリを実行します。

1:一致して利用可能なすべての部屋を取得します(これには部分的に利用可能な部屋が含まれます)2:利用できないすべての部屋を取得します

2番目のクエリは、ページネーションの結果をさらに表示する必要がある場合にのみ実行されることは明らかです。

その後、ステップ1のすべての結果が後処理され、要求された期間全体で利用可能かどうかが判断されます。

さらなる「改善」は、スキーマに新しいフィールド、availableDayを導入することです。予約可能な日ごとに、その日付のエントリがあります。これにより、最初のクエリが2つの別々のクエリに分割されます。これは、SolRの追加フィルターの問題にすぎません。

私を正しい方向に向けてくれてありがとう!

于 2012-10-18T16:03:46.773 に答える