Java Snowball search_analyzer无法使用多匹配查询
我正在尝试使用snowball analyzer对索引进行查询。它似乎工作不正常。如果我输入“starbucks”,它将返回0个结果,但是如果我输入“starbucks”,它将返回名称中带有“starbucks”的所有数据 我知道,在进行常规搜索时,必须明确指定字段,以便使用搜索分析器 奇怪吗_mapping说我在使用snowball index_分析器,但没有提到snowball search_分析器 映射代码段:Java Snowball search_analyzer无法使用多匹配查询,java,scala,
elasticsearch,Java,Scala,
elasticsearch,我正在尝试使用snowball analyzer对索引进行查询。它似乎工作不正常。如果我输入“starbucks”,它将返回0个结果,但是如果我输入“starbucks”,它将返回名称中带有“starbucks”的所有数据 我知道,在进行常规搜索时,必须明确指定字段,以便使用搜索分析器 奇怪吗_mapping说我在使用snowball index_分析器,但没有提到snowball search_分析器 映射代码段: name: { type: "string",
name: {
type: "string",
search_analyzer : "snowball",
index_analyzer : "snowball",
boost : 1
},
tags: {
type: "string",
search_analyzer : "snowball",
index_analyzer : "snowball",
boost : 4
}
来自/business/business/\u映射的代码片段
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();
termQuery
中指定的术语未按原样分析和使用。由于星巴克这个词被编入了星巴克的索引,你可以得到一些结果。当您搜索术语星巴克时,索引中没有此类术语,您不会得到任何结果。我建议改为使用text
query,它将对您的术语进行分析
val response = client.prepareSearch("businesses")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(text("name", term))
.setFrom(0).setSize(100).setExplain(true)
.execute()
.actionGet();
我还通过执行多匹配查询解决了这个问题。这似乎正确地执行了搜索分析器
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();
这也是使用地理距离过滤器将自定义分数查询与过滤的多匹配查询相结合的一个很好的示例。analyzer意味着搜索分析器和索引分析器是相同的。听起来不错。