优化搜索查询

时间:2008-12-30 17:23:39

标签: lucene

我正在开发一个使用Lucene.net(版本2.0.0.4)进行商店搜索的Web应用程序。 虽然我的网络应用程序用户可以搜索位于距离给定位置50英里范围内的美国商店。 我正在使用第三方API来查找半径内的所有城市。对于一个城市说新泽西州的爱迪生,它给了我40英里内的大约450个城市(API返回包含450个城市的.Net哈希表)。 通过遍历此哈希表,我使用BooleanQuery / Query类来构建lucene查询。

在这种情况下,我发现通过lucene构建,执行和返回搜索结果需要花费大量时间。 有什么办法可以优化这段代码吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

在构建索引时,将城市映射到纬度和经度坐标。在进行半径搜索时,在Web应用程序中,将搜索到的城市映射到坐标并进行范围查询(您需要将距离转换为坐标所在的单位)。

这不完美,因为您将搜索正方形而不是圆形,但如果您需要精确,可以编写一些代码来过滤原始半径之外的结果。

答案 1 :(得分:0)

我认为这次演出的关键在于考虑如何存储数据以及围绕它存储一些元数据。

我的意思是什么?

例如,列出在新泽西州有商店的城市列表,并根据您的主列表过滤掉从您的第三方API返回的城市。您可能会发现在返回的450个中只有5个匹配。同样,我不会在一个查询中组合450个查询 - 尝试将它们组合成较小的数量。

此外,如果您可以根据状态创建索引,您可能会发现较小的索引(特别是NJ)可以比在较大索引中选择特定状态的数据更有效地处理查询。

希望这有帮助, 夏兰

答案 2 :(得分:0)

KenE's answer是一个很好的,你应该谷歌"lucene spatial search"获取有关该方法的更多信息。

假设半径总是40英里,你可以采用另一种方式:只需逆转过程。

有一个名为nearyby_city的字段。对于索引中的每个商店,添加半径40英里的城市列表。现在,当您在新泽西州爱迪生附近搜索商店时,只需在查询中添加nearby_city:"Edison, NJ"字词即可。现在,只有该城市40英里范围内的商店才符合您的查询。