0

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

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

谢谢!

4

3 回答 3

1

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

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

于 2009-01-27T21:40:29.777 回答
0

我认为执行此操作的关键是考虑如何存储数据并围绕它拥有一些元数据。

我的意思是什么?

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

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

希望这会有所帮助,Ciaran

于 2008-12-31T11:21:06.040 回答
0

KenE 的回答很好,您应该在谷歌上搜索“lucene 空间搜索”以获取有关该方法的更多信息。

假设半径始终为 40 英里,您还可以采用另一种方法:只需将过程颠倒过来即可。

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

于 2009-01-29T08:15:14.410 回答