更正几个参数的 SearchQuery - Elasticsearch & Spring Boot
Correct SearchQuery for few parameters - Elasticsearch & Spring Boot
我是 Elasticsearch 的新手。我正在尝试使用 ES 在 Spring 启动应用程序中创建搜索,但我在 ES 中遇到了查询问题。
这是我的应用程序的样子。
型号:
@Entity
@Document(indexName = "sport", type = "sport")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Sport {
@Id
@GeneratedValue
private Long id;
@Column(length = 256)
private String name;
}
服务中的搜索方法:
@GetMapping(value = "/findSportByNameAndId/{name}/{id}")
public List<Sport> findSportByNameAndId(@PathVariable String name, @PathVariable String id){
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchQuery("name", name)
.operator(AND)
.fuzziness(Fuzziness.TWO)
.prefixLength(3))
.withQuery(matchQuery("id", id)
.operator(AND))
.build();
List<Sport> sports = operations.queryForList(searchQuery, Sport.class);
return sports;
}
部分ES索引根据上述模型:
"content": [
{
"id": 2,
"name": "Muay Thai"
},
{
"id": 1,
"name": "Kickboxing"
},
{
"id": 3,
"name": "Boxing"
}
],
当我尝试使用 name
参数查找内容时,它总是坚持 id
而忽略 name
。像这样:
SearchQuery
应该如何在 id
中找到 name
的 Sport
?
终于知道怎么解决了。在这种情况下,我需要使用 QueryBuilder
来指定每个参数:
@GetMapping(value = "/findSportByNameAndId/{name}/{id}")
public List<Sport> findSportByNameAndId(@PathVariable String name, @PathVariable String id){
QueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("name", name)
.operator(AND)
.fuzziness(Fuzziness.TWO)
.prefixLength(3)
)
.filter(QueryBuilders.termQuery("id", id));
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(qb).build();
List<Sport> sports = operations.queryForList(searchQuery, Sport.class);
return sports;
}
您基本上是在进行两次搜索;第一个带有 name 参数,第二个(覆盖第一个)带有 id。布尔运算符(在本例中为 AND)是无用的,除非您使用 bool query.
我是 Elasticsearch 的新手。我正在尝试使用 ES 在 Spring 启动应用程序中创建搜索,但我在 ES 中遇到了查询问题。
这是我的应用程序的样子。
型号:
@Entity
@Document(indexName = "sport", type = "sport")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Sport {
@Id
@GeneratedValue
private Long id;
@Column(length = 256)
private String name;
}
服务中的搜索方法:
@GetMapping(value = "/findSportByNameAndId/{name}/{id}")
public List<Sport> findSportByNameAndId(@PathVariable String name, @PathVariable String id){
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchQuery("name", name)
.operator(AND)
.fuzziness(Fuzziness.TWO)
.prefixLength(3))
.withQuery(matchQuery("id", id)
.operator(AND))
.build();
List<Sport> sports = operations.queryForList(searchQuery, Sport.class);
return sports;
}
部分ES索引根据上述模型:
"content": [
{
"id": 2,
"name": "Muay Thai"
},
{
"id": 1,
"name": "Kickboxing"
},
{
"id": 3,
"name": "Boxing"
}
],
当我尝试使用 name
参数查找内容时,它总是坚持 id
而忽略 name
。像这样:
SearchQuery
应该如何在 id
中找到 name
的 Sport
?
终于知道怎么解决了。在这种情况下,我需要使用 QueryBuilder
来指定每个参数:
@GetMapping(value = "/findSportByNameAndId/{name}/{id}")
public List<Sport> findSportByNameAndId(@PathVariable String name, @PathVariable String id){
QueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("name", name)
.operator(AND)
.fuzziness(Fuzziness.TWO)
.prefixLength(3)
)
.filter(QueryBuilders.termQuery("id", id));
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(qb).build();
List<Sport> sports = operations.queryForList(searchQuery, Sport.class);
return sports;
}
您基本上是在进行两次搜索;第一个带有 name 参数,第二个(覆盖第一个)带有 id。布尔运算符(在本例中为 AND)是无用的,除非您使用 bool query.