Sorting SolR-搜索房间可用性并按结果排序
我正在尝试使用SolR和PHP实现一种酒店/招待所搜索。对于任何可用的房间,我都会在索引中存储一个新文档,其中包含有关住宿的相关信息以及包含availableFrom和availableTill日期的多值属性。对SolR运行查询以在特定时间范围内获得所有房间应该不会那么困难,但当涉及到排序时,我的大脑会出错 我的目标是不仅显示可用的住宿,而且显示所有与目的地(国家/城市/地区)的常规筛选查询相匹配的住宿,并对这些结果进行排序,以便将所有可用的房间排序到列表的开头 因此,对于从2012年12月1日到12月5日在慕尼黑的房间搜索,我希望得到如下结果:Sorting SolR-搜索房间可用性并按结果排序,sorting,solr,Sorting,Solr,我正在尝试使用SolR和PHP实现一种酒店/招待所搜索。对于任何可用的房间,我都会在索引中存储一个新文档,其中包含有关住宿的相关信息以及包含availableFrom和availableTill日期的多值属性。对SolR运行查询以在特定时间范围内获得所有房间应该不会那么困难,但当涉及到排序时,我的大脑会出错 我的目标是不仅显示可用的住宿,而且显示所有与目的地(国家/城市/地区)的常规筛选查询相匹配的住宿,并对这些结果进行排序,以便将所有可用的房间排序到列表的开头 因此,对于从2012年12月1日
- A室(可用)
- B室(可用)
- 房间C(在给定时间段内不完全可用=>很好拥有)
- D房间(完全不可用)
<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" />
干杯-Sven好吧,你必须根据“房间”字段(或可用性,取决于你)增加你的查询,并根据值给出不同的分数 快速示例: 让我们给一个可用房间增加20,部分可用房间增加10,不可用房间增加1(只是为了确定) 您的查询(url方面,我不知道solr的php接口)需要如下内容
<query>&bq=rooms:avail^20.0&bq=rooms:part-avail^10.0...
&bq=rooms:avail^20.0&bq=rooms:part avail^10.0。。。
建议:如果您使用的是Demax查询处理程序,它会让人上瘾。这意味着您必须添加一个更大的提升(例如,2000而不是20),因为它将提升值添加到查询分数中
此外,您应该从solr wiki中进行检查,这比任何解释都好。好吧,您必须根据字段“rooms”(或可用性,取决于您)增加查询量,并根据值给出不同的分数 快速示例: 让我们给一个可用房间增加20,部分可用房间增加10,不可用房间增加1(只是为了确定) 您的查询(url方面,我不知道solr的php接口)需要如下内容
<query>&bq=rooms:avail^20.0&bq=rooms:part-avail^10.0...
&bq=rooms:avail^20.0&bq=rooms:part avail^10.0。。。
建议:如果您使用的是Demax查询处理程序,它会让人上瘾。这意味着您必须添加一个更大的提升(例如,2000而不是20),因为它将提升值添加到查询分数中
另外,你应该从solr wiki上查看,这比任何解释都好。好吧,我在这里做了一些研究和测试。。。对于我的问题,当前最好的解决方案是对SolR执行多个查询。正如Samuele所建议的那样,我分两步查询SolR中所有符合给定条件和时间跨度的住宿 1:获得所有匹配且可用的房间(包括部分可用的房间) 2:获取所有不可用的房间 第二个查询显然只在需要显示分页的更多结果cos时执行 之后,对步骤1中的所有结果进行后处理,以确定它们在整个请求的时间跨度内是否可用 进一步的“改进”是在模式中引入一个新字段:availableDay。对于每个可预订的日期,都会有一个该日期的条目。这将把第一个查询分成两个独立的查询。这仅仅是SolR的附加过滤器的问题
再次感谢你为我指明了正确的方向 嗯,我在这里做了一些研究和测试。。。对于我的问题,当前最好的解决方案是对SolR执行多个查询。正如Samuele所建议的那样,我分两步查询SolR中所有符合给定条件和时间跨度的住宿 1:获得所有匹配且可用的房间(包括部分可用的房间) 2:获取所有不可用的房间 第二个查询显然只在需要显示分页的更多结果cos时执行 之后,对步骤1中的所有结果进行后处理,以确定它们在整个请求的时间跨度内是否可用 进一步的“改进”是在模式中引入一个新字段:availableDay。对于每个可预订的日期,都会有一个该日期的条目。这将把第一个查询分成两个独立的查询。这仅仅是SolR的附加过滤器的问题
再次感谢你为我指明了正确的方向 这难道不意味着我必须在索引中的任何可能的旅行日期中添加一个文档吗?如上所述,我每个房间都有一个文档,该文档包含每个可预订时段的多个起止日期。我不认为,您首先运行常规查询(特定时间范围内的所有房间),然后在排序参数上使用提升值。刚才通过我的代码检查了一下,我也是这么做的:如果一个值出现在一个确定的字段中,那么这个字段会比它有很大的提升。使用php(在我的例子中是python)应该可以帮助您更好地优化查询(例如:使用if语句来决定是否以及您想要提升什么等),在timespan上运行初始查询和过滤器只会显示可用的房间。删除此筛选器可能会导致返回大量文档。是否有可能在运行查询时动态创建一个“可用”字段并使用它来提高分数?如“完全可用”^100“部分可用”^50“非av