ElasticsearchOperations 查询不返回完全匹配项
ElasticsearchOperations query not returning exact matches
我正在为 Elastic 搜索中的查询而苦苦挣扎,所以我希望这里有人可以帮助我。
所以我在弹性搜索中有一个索引,它存储了一些关于用户的基本信息。然后我有我的 Spring 启动 API 允许客户端搜索所述索引。
在我的应用中,当用户注册时,他们可以在网站上选择一个显示名称。现在,当他们输入显示名称时,我希望能够检查弹性并告诉他们它是否已被使用。
但是,我遇到困难的地方是,假设我的索引中有一个用户的显示名称为“John Boy”,现在用户二注册并想要显示名称“Boy”。当我搜索“男孩”是否被带走时,我找回了“约翰男孩”。我想要它,所以查询会告诉我“男孩”是否有空,而不关心“约翰男孩”是否被占用。
我以为我只是在了解 ES 但也许不是,我的印象是字段(请参阅下面的索引映射)关键字我可以进行术语搜索并取回完全匹配?
下面我包含了我的 Pojo 和我的 ES 索引映射。如果有人能帮助我请....感谢阅读:
搜索方法
public long checkUserNameAvailability(String query) {
QueryBuilder matchSpecificFieldQuery= QueryBuilders
.termQuery("displayName", query);
Query searchQuery = new NativeSearchQueryBuilder()
.withFilter(matchSpecificFieldQuery)
.build();
SearchHits<UserProfile> searchSuggestions =
elasticsearchOperations.search(searchQuery,
UserProfile.class,
IndexCoordinates.of(elasticUserIndex));
List<UserProfile> suggestions = new ArrayList<>();
return searchSuggestions.getTotalHits();
}
波乔
@Getter
@Setter
@Document(indexName = "userprofiles")
public class UserProfile {
@Field(type = FieldType.Text, name = "userId")
private String userId;
@Field(type = FieldType.Keyword, name = "displayName")
private String displayName;
@Field(type = FieldType.Text, name = "name")
private String name;
}
ES 映射
{
"userprofiles": {
"mappings": {
"properties": {
"displayName": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"type": "text"
},
"name": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"type": "text"
},
"userId": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"type": "text"
}
}
}
}
}
旁注:
我正在使用 Spring 引导版本 2.4.3
和
compile('org.springframework.boot:spring-boot-starter-data-elasticsearch')
compile group: 'org.springframework.data', name: 'spring-data-elasticsearch', version: '4.1.5'
再次感谢
我认为您应该重新考虑您正在使用的查询类型。
尝试在 .keyword 字段上使用简单匹配。
也许你应该使用关键字查询,因为'displayName'字段类型是文本,它在查询和索引中都是分析器。
QueryBuilder matchSpecificFieldQuery= QueryBuilders
.termQuery("displayName.keyword", query);
我正在为 Elastic 搜索中的查询而苦苦挣扎,所以我希望这里有人可以帮助我。
所以我在弹性搜索中有一个索引,它存储了一些关于用户的基本信息。然后我有我的 Spring 启动 API 允许客户端搜索所述索引。
在我的应用中,当用户注册时,他们可以在网站上选择一个显示名称。现在,当他们输入显示名称时,我希望能够检查弹性并告诉他们它是否已被使用。
但是,我遇到困难的地方是,假设我的索引中有一个用户的显示名称为“John Boy”,现在用户二注册并想要显示名称“Boy”。当我搜索“男孩”是否被带走时,我找回了“约翰男孩”。我想要它,所以查询会告诉我“男孩”是否有空,而不关心“约翰男孩”是否被占用。
我以为我只是在了解 ES 但也许不是,我的印象是字段(请参阅下面的索引映射)关键字我可以进行术语搜索并取回完全匹配?
下面我包含了我的 Pojo 和我的 ES 索引映射。如果有人能帮助我请....感谢阅读:
搜索方法
public long checkUserNameAvailability(String query) {
QueryBuilder matchSpecificFieldQuery= QueryBuilders
.termQuery("displayName", query);
Query searchQuery = new NativeSearchQueryBuilder()
.withFilter(matchSpecificFieldQuery)
.build();
SearchHits<UserProfile> searchSuggestions =
elasticsearchOperations.search(searchQuery,
UserProfile.class,
IndexCoordinates.of(elasticUserIndex));
List<UserProfile> suggestions = new ArrayList<>();
return searchSuggestions.getTotalHits();
}
波乔
@Getter
@Setter
@Document(indexName = "userprofiles")
public class UserProfile {
@Field(type = FieldType.Text, name = "userId")
private String userId;
@Field(type = FieldType.Keyword, name = "displayName")
private String displayName;
@Field(type = FieldType.Text, name = "name")
private String name;
}
ES 映射
{
"userprofiles": {
"mappings": {
"properties": {
"displayName": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"type": "text"
},
"name": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"type": "text"
},
"userId": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"type": "text"
}
}
}
}
}
旁注: 我正在使用 Spring 引导版本 2.4.3
和
compile('org.springframework.boot:spring-boot-starter-data-elasticsearch')
compile group: 'org.springframework.data', name: 'spring-data-elasticsearch', version: '4.1.5'
再次感谢
我认为您应该重新考虑您正在使用的查询类型。 尝试在 .keyword 字段上使用简单匹配。
也许你应该使用关键字查询,因为'displayName'字段类型是文本,它在查询和索引中都是分析器。
QueryBuilder matchSpecificFieldQuery= QueryBuilders
.termQuery("displayName.keyword", query);