0

我正在使用带有 multiMatchQuery 的自定义分数查询。最终我想要的很简单,几乎不需要解释。在我的 Java 自定义分数脚本中,我希望能够找出结果与哪个字段匹配。

例子:

如果我搜索 Starbucks 并返回一个名为 Starbucks 的结果,那么我希望能够知道 name.basic 是与我的查询匹配的字段。如果我搜索咖啡并且星巴克回来了,我希望能够知道标签是匹配的字段。

有没有办法做到这一点?

搜索查询代码:

def basicSearchableSearch(t: String, lat: Double, lon: Double, r: Double, z: Int, bb: BoundingBox, max: Int): SearchResponse = {
    val multiQuery = filteredQuery(
      multiMatchQuery(t)
        //Matches businesses and POIs
        .field("name.basic").operator(Operator.OR)
                .field("name.no_space")
                //Businesses only
        .field("tags").boost(6f), 
      geoBoundingBoxFilter("location")
        .bottomRight(bb.botRight.y,bb.botRight.x)
        .topLeft(bb.topLeft.y,bb.topLeft.x)
    )

    val customQuery = customScoreQuery(
      multiQuery
    )
    .script("customJavaScript")
    .lang("native")
    .param("lat",lat)
    .param("lon",lon)
    .param("zoom",z)

    global.Global.getClient().prepareSearch("searchable")
      .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
      .setQuery(customQuery)
      .setFrom(0).setSize(max)
      .execute()
      .actionGet();
  }
4

1 回答 1

1

它只对简单的查询很简单。在复杂的查询中,哪个字段匹配的问题实际上是非常重要的。所以,我想不出任何有效的方法来做到这一点。

也许,您可以考虑将自定义分数计算移到更接近匹配的位置。multi_match查询基本上是由 dis_max 查询组合的同一查询字符串上的一组匹配查询快捷方式。所以,你目前正在构建这样的东西:

custom_score(
    filtered(
        dis_max(match_1, match_2, match_3)
    )
)

您可以做的是将您的 custom_score 移动到 dis_max 下并构建如下内容:

filtered(
    dis_max(
        custom_score_1(match_1),
        custom_score_2(match_2),
        custom_score_3(match_3)
    )
)

显然,这将是一个稍微不同的查询,因为dis_max它将根据自定义分数而不是原始分数进行操作。

于 2013-03-02T03:04:34.160 回答