【问题标题】:Snowball search_analyzer not working with multi_match querySnowball search_analyzer 不适用于 multi_match 查询
【发布时间】:2012-12-06 23:50:01
【问题描述】:

我正在尝试使用雪球分析器对索引进行查询。它似乎无法正常工作。如果我输入“starbucks”,它将返回 0 个结果,但是如果我输入“starbuck”,它会返回名称中带有“Starbucks”的所有数据。

我知道在进行普通搜索时,您必须明确指定该字段才能使用 search_analyzer。

_mapping 说我使用的是雪球 index_analyzer 但没有提到雪球 search_analyzer,这很奇怪吗?

映射片段:

name: {
            type: "string",
            search_analyzer : "snowball", 
            index_analyzer : "snowball",
            boost : 1
      },
tags: {
            type: "string",
            search_analyzer : "snowball", 
            index_analyzer : "snowball",
            boost : 4
      }

来自 /businesses/business/_mapping 的片段

name: {type: "string",analyzer: "snowball"},
tags: {type: "string",boost: 4,analyzer: "snowball"}

用于搜索的 Java 代码:

val response = client.prepareSearch("businesses")
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
        .setQuery(termQuery("name", term))
        .setFrom(0).setSize(100).setExplain(true)
        .execute()
        .actionGet();

【问题讨论】:

  • analyzer 表示 search_analyzer 和 index_analyzer 相同。听起来不错。

标签: java scala elasticsearch


【解决方案1】:

termQuery 中指定的术语未按原样分析和使用。由于单词Starbucks 被索引为术语starbuck,因此您可以获得一些结果。当您搜索术语 Starbucks 时,索引中没有这样的术语并且您没有得到任何结果。我建议改用text 查询,它将对您的术语进行分析。

val response = client.prepareSearch("businesses")
    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
    .setQuery(text("name", term))
    .setFrom(0).setSize(100).setExplain(true)
    .execute()
    .actionGet();

【讨论】:

    【解决方案2】:

    我还通过执行 multi_match 查询解决了这个问题。这似乎正确地执行了搜索分析器。

    val customQuery = customScoreQuery(
            filteredQuery(
                multiMatchQuery("Gamestop".toLowerCase())
                    .field("tags")
                    .field("name"), 
                geoDistanceFilter("location")
                .point(40.76405282025, -73.972994269042)
                .distance(10, DistanceUnit.KILOMETERS)
            )
         )
         .script("customscript")
         .lang("native")
         .param("lat",40.76405282025)
         .param("lon",-73.972994269042)
    
        val response = client.prepareSearch("businesses")
            .setSearchType(SearchType.QUERY_AND_FETCH)
            .setQuery(customQuery)
            .setFrom(0).setSize(100).setExplain(true)
            .execute()
            .actionGet();
    

    这也是将自定义分数查询与使用地理距离过滤器过滤的多重匹配查询相结合的一个很好的例子。

    【讨论】:

      猜你喜欢
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 2018-02-25
      • 2011-05-20
      • 2020-04-13
      相关资源
      最近更新 更多