0

我对在 ElasticSearch 中返回错误结果的位置查询有疑问。

在我们的系统中,一个商业搜索引擎,每次搜索都需要两个输入:一个位置和一个查询字符串,例如

q=sushi
location=Greenwich Village, New York, New York

我希望搜索首先显示格林威治村的寿司,然后显示格林威治村外的寿司,但绝不会显示非寿司结果。

问题是,由于location查询,格林威治村的任何事物都得到了匹配——律师、医生等等。我想对 ElasticSearch 说以下内容:

如果 q 匹配,则 location 不必(返回格林威治村外的寿司是可以的),但如果位置匹配,除非 q 也匹配,否则不要返回它(返回格林威治村的非寿司企业是不行的) .

有人对如何做到这一点有任何想法吗?

4

2 回答 2

2

听起来您想搜索“寿司”(您不想要非寿司结果),但按位置对结果进行排序(您首先想要格林威治村的结果)。

如果您将位置存储为地理点,您可以简单地使用距离对结果进行排序

如果位置只是一个字段,并且您只能知道业务是在位置内部还是外部,则可以使用自定义过滤器分数查询来提高所需位置的结果的相关性。该query部分应包含对“sushi”的搜索,并且该filters部分应包含对位置的搜索。

于 2012-11-02T19:05:31.227 回答
0

我合并了这篇文章和这里的信息,以提出以下解决方案。

  1. 用中心点索引每个“地方”(社区、城市等),并索引每个企业的坐标。

  2. 索引附加到包含它们的企业的地点 ID。

  3. 使用子搜索将输入到位置栏中的文本转换为地点记录。

  4. 使用 CustomScoreQuery 通过以下公式修改每个结果的分数,该公式是通过反复试验得出的:
    new_score = old_score / (1 + distance_between_place_centerpoint_and_result)^3

  5. 还针对 place_ids 字段查询由 3 产生的地点 ID,作为“应该”布尔查询。这对实际落在指定位置范围内的所有内容提供了一个平坦的提升。

这种策略的一个副作用是,该地点中心点附近的企业被认为更相关——在我看来,这是否正确是有争议的。但除此之外,它工作得很好。

感谢 imitov 的洞察力,帮助我想出了这个解决方案。

于 2012-11-15T18:16:58.203 回答