2008-12-30 111 views
0

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

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

谢谢!

+0

制作一个计算器帐户,以便您可以对答案进行投票并将其标记为已接受。这是一个社区,那些坚持为他人提供帮助的人往往会获得更多的帮助。 – erickson 2008-12-30 19:18:54

回答

0

我认为这次演出的关键在于考虑如何存储数据以及如何存储数据。

这是什么意思?

例如,有一个在新泽西州有商店的城市列表,并根据您的主列表过滤掉从您的第三方API返回的城市。你可能会发现你在返回的450个中只有5个匹配。同样,我不会在一个查询中结合450个查询 - 尝试并将它们组合成更小的数量。另外,如果您可以根据状态创建索引,那么您可能会发现较小的索引(特别是NJ)会比在较大索引中选择特定状态的数据更有效地处理查询。

希望这有助于 夏兰

1

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

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

0

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

还有另外一种方法,假设半径总是40英里:只是逆转过程。

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