Snowball search_analyzer不使用multi_match查询

时间:2012-12-05 18:29:35

标签: java scala elasticsearch

我正在尝试使用雪球分析器对索引进行查询。它似乎无法正常工作。如果我输入“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
      }

来自/ business / 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();

2 个答案:

答案 0 :(得分:2)

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();

答案 1 :(得分:0)

我还通过执行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();

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