1

我正在尝试使用 SolR 和 PHP 实现一种酒店/旅馆搜索。对于任何可用的房间,我都会在我的索引中存储一个新文档,其中包含有关住宿的相关信息和包含 availableFrom 和 availableTill 日期的多值属性。对 SolR 运行查询以在特定时间跨度内获取所有房间应该不难,但在排序时我的大脑搞砸了......

我的目标是不仅显示可用的住宿,而且所有这些都与目的地(国家/城市/地区)上的一般过滤查询匹配,并对这些结果进行排序,以便所有可用房间都排序到列表的开头。

因此,在 2012 年 12 月 1 日至 12 月 5 日期间在慕尼黑搜索房间时,我希望得到如下结果:

  • A室(可用)
  • B室(可用)
  • 房间 C(在给定的时期内不完全可用 => 很高兴拥有)
  • D室(完全没有)

目前我正在运行 SolR 3.6,但如有必要可以切换到新的 4.0。

有任何 Solr-Guru 对我有什么建议吗?任何帮助表示赞赏:-)

-编辑-

我认为 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" />

干杯 - 斯文

4

2 回答 2

1

好吧,您必须根据“房间”字段(或可用性,取决于您)来提升您的查询,并根据值给出不同的分数

快速示例:

让我们给一个可用的房间提升 20,部分可用的提升 10,而不可用的提升 1(只是为了确定)

您的查询(url-wise,我不知道 solr 的 php 接口)需要类似

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

建议:如果您使用 dismax 查询处理程序,它会让人上瘾。这意味着您必须添加比这更大的提升(例如 2000 而不是 20),因为它将提升值添加到查询分数

此外,您应该从 solr wiki 检查此链接,这比任何解释都要好。

于 2012-10-17T07:27:27.527 回答
0

好吧,我在这里对整个事情进行了一些研究和测试......针对我的问题的正确且可能最好的解决方案是针对 SolR 执行多个查询。正如 Samuele 所建议的,我分两步向 SolR 查询所有符合给定条件和时间跨度的住宿。

1:获取所有匹配且可用的房间(包括部分可用的房间) 2:获取所有不可用的房间

第二个查询显然只在我们需要显示更多结果'cos的分页时才执行。

之后,对步骤 1 的所有结果进行后处理,以确定它们是否在整个请求的时间跨度内可用。

进一步的“改进”是在模式中引入一个新字段:availableDay。对于每个可预订的日期,该日期都会有一个条目。这会将第一个查询分成两个单独的查询。这只是 SolR 的附加过滤器的问题。

再次感谢您为我指明正确的方向!

于 2012-10-18T16:03:46.773 回答