我是弹性搜索弹簧数据的新手,今天我试图让查询使用Spring数据ES存储库。
我必须查找用户名列表,如果它与索引完全匹配,则需要将这些用户作为结果返回。
我尝试使用内置存储库' In'这样做的方法,但它返回部分匹配,请帮我使其像SQL IN查询一样工作。
这是我的存储库代码:
public interface UserRepository extends ElasticsearchRepository<EsUser, String>
{
public List<EsUser> findByUserAccountUserNameIn(Collection<String> terms);
}
REQUEST:
{"terms":["vijay", "arun"], "type":"NAME"}
响应:
[
{
"userId": "236000",
"fbId": "",
"userAccount": {
"userName": "arun",
"urlFriendlyName": "arun",
},
"userProfile": {
},
"userStats": {
}
},
{
"userId": "6228",
"userAccount": {
"userName": "vijay",
"urlFriendlyName": "vijay",
},
"userProfile": {
},
"userStats": {
}
},
{
"userId": "236000",
"fbId": "",
"userAccount": {
"userName": "arun singh",
"urlFriendlyName": "arun-singh",
},
"userProfile": {
},
"userStats": {
}
}
{
"userId": "236000",
"fbId": "",
"userAccount": {
"userName": "vijay mohan",
"urlFriendlyName": "vijay-mohan",
},
"userProfile": {
},
"userStats": {
}
}
]
答案 0 :(得分:1)
这是因为您的userAccount.userName
字段是已分析的字符串,因此,已将两个标记arun
和singh
编入索引。然后,您的查询将匹配第一个令牌,这是正常的。
为了防止这种情况并保证完全匹配,您需要将字段声明为not_analyzed
,如下所示:
@Field(index = FieldIndex.not_analyzed)
private String userName;
然后,您需要删除/_template
中的索引和关联模板,重新启动应用程序,以便使用正确的字段映射创建新模板和索引。
然后您的查询将有效。