【问题标题】:Implementing a location search in ElasticSearch在 ElasticSearch 中实现位置搜索
【发布时间】:2012-11-16 02:16:58
【问题描述】:

我遇到了位置查询在 ElasticSearch 中返回错误结果的问题。

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

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

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

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

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

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

【问题讨论】:

    标签: search elasticsearch


    【解决方案1】:

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

    如果您将位置存储为地理点,您可以简单地使用距离到sort 您的结果。

    如果位置只是一个字段,并且您只能知道商家是在某个位置内部还是外部,您可以使用Custom Filters Score 查询来提高所需位置的结果的相关性。 query 部分应包含对“sushi”的搜索,filters 部分应包含对位置的搜索。

    【讨论】:

    • 我们确实有一个位置中心点,并且它们的名称在一个字段中。我正在发布我想出的解决方案——它在这里包含了您回答的各种元素,以及您对我的另一个 ElasticSearch 问题的回答,stackoverflow.com/questions/13053295/…
    【解决方案2】:

    我结合了这篇文章和here 中的信息来提出以下解决方案。

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      相关资源
      最近更新 更多