1

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

2 回答 2

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();
于 2012-12-06T00:33:30.803 回答
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();

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

于 2012-12-06T15:50:01.800 回答