我正在使用Spring数据弹性搜索来查询我的弹性文档。我的Elasticsearch实体类:
//all the annotation things i.e lombok, de/serializer etc
@Document(indexName = "project", type = "project")
@EqualsAndHashCode
public class ProjectEntity extends CommonProperty implements Serializable {
@Id
private String id;
private String projectName;
private String description;
private String parentProjectId;
private Long projectOwner;
private String projectOwnerName;
private Long projectManager;
private String projectManagerName;
private String departmentId;
private String status;
private String organizationId;
@Field(type = FieldType.Nested)
private List<ActionStatusEntity> actionStatusList= new ArrayList<>();
@Field(type = FieldType.Nested)
private List<TeamMember> teamMemberList;
@Field(type = FieldType.Nested)
private List<UserDefineProperty> riskList;
}
我已经做了其他事情,比如设置存储库,为了简洁起见,我避免了。数据搜索:
projectRepository.findByOrganizationIdAndProjectName(userEntity.getOrganizationId().toString() ,projectRequest.getProjectName().trim());
//userEntity.getOrganizationId().toString()="28", projectName="Team Test"
以上调用的Spring生成查询:
{
"from": 0,
"size": 10000,
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "28",
"fields": [
"organizationId^1.0"
],
"type": "best_fields",
"default_operator": "and",
"max_determinized_states": 10000,
"enable_position_increments": true,
"fuzziness": "AUTO",
"fuzzy_prefix_length": 0,
"fuzzy_max_expansions": 50,
"phrase_slop": 0,
"escape": false,
"auto_generate_synonyms_phrase_query": true,
"fuzzy_transpositions": true,
"boost": 1
}
},
{
"query_string": {
"query": "Team Test",
"fields": [
"projectName^1.0"
],
"type": "best_fields",
"default_operator": "and",
"max_determinized_states": 10000,
"enable_position_increments": true,
"fuzziness": "AUTO",
"fuzzy_prefix_length": 0,
"fuzzy_max_expansions": 50,
"phrase_slop": 0,
"escape": false,
"auto_generate_synonyms_phrase_query": true,
"fuzzy_transpositions": true,
"boost": 1
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"version": true
}
查询结果:
{
"took" : 8,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 4.1767306,
"hits" : [
{
"_index" : "project",
"_type" : "project",
"_id" : "215",
"_version" : 2,
"_score" : 4.1767306,
"_source" : {
"projectName" : "team member only test",
"description" : "team member only test",
"projectOwner" : 50,
"projectOwnerName" : "***",
"departmentId" : "team member only test",
"organizationId" : "28"
}
},
{
"_index" : "project",
"_type" : "project",
"_id" : "408",
"_version" : 17,
"_score" : 4.1767306,
"_source" : {
"projectName" : "Category & Team adding test",
"description" : "Category & Team adding test",
"projectOwner" : 50,
"projectOwnerName" : "***",
"projectManager" : 50,
"projectManagerName" : "***",
"departmentId" : "cat",
"organizationId" : "28"
}
},
{
"_index" : "project",
"_type" : "project",
"_id" : "452",
"_version" : 4,
"_score" : 3.4388955,
"_source" : {
"projectName" : "team member not in system test",
"description" : "id-452",
"projectOwner" : 53,
"projectOwnerName" : "***",
"projectManager" : 202,
"projectManagerName" : "***",
"departmentId" : "abc",
"organizationId" : "28",
}
}
]
}
}
查看结果集,projectName
字段值的检查方式与contains
方法类似!它没有检查完整的给定参数
为什么会发生这种情况?如何解决这些问题
添加:organizationId和projectName字段设置为fieldData=true
Spring Data Elasticsearch从方法名称派生的查询是一个Elasticsearch字符串查询,具有给定的参数,正如您所注意到的。对于这些Elasticsearch,分析和解析术语,然后按相同顺序搜索具有这些术语的文档。
您对"的查询;团队测试">有两个术语;团队和";测试">,并且您显示的所有文档的项目名称中都有这些术语,因此会返回它们。
如果你有一个文件"团队测试">并且这两者之间没有其他条款,这将以更高的分数返回。
之所以选择此实现,是因为它是在Elasticsearch中搜索时通常所期望的。具有带名称的索引并搜索"em"的图像;Harry Miller"将找不到具有"的文档;Harry B.Miller">。
您可以编写一个自定义存储库方法来构建满足您需求的查询,并使用它。或者,如果您总是想对此字段进行精确搜索,可以将其定义为keyword
字段,以防止解析和分析。
您可以将match_phrase查询与这个存储库方法定义一起使用(这里只使用一个参数,您需要添加组织id,但对于这个小代码示例来说,结果查询太复杂了(:
@Query("{"match_phrase": {"projectName": "?0"}}n")
SearchHits<ProjectEntity> findByProjectName(String name);
我不知道Spring Data Elasticsearch,但添加了一个使用JSON格式的索引数据、搜索查询和搜索结果的工作示例
指数数据:
将上述三份文件(有问题(全部编入索引,并插入第四份文件,如下所示。
{
"projectName": "team test",
"description": "id-452",
"projectOwner": 53,
"projectOwnerName": "***",
"projectManager": 202,
"projectManagerName": "***",
"departmentId": "abc",
"organizationId": "28"
}
搜索查询:
{
"query": {
"bool": {
"must": [
{
"match": {
"organizationId": 28
}
},
{
"multi_match": {
"query": "Team Test",
"type": "phrase",
"fields": [
"projectName"
]
}
}
]
}
}
}
搜索结果:
"hits": [
{
"_index": "stof_64151693",
"_type": "_doc",
"_id": "4",
"_score": 0.5003766,
"_source": {
"projectName": "team test",
"description": "id-452",
"projectOwner": 53,
"projectOwnerName": "***",
"projectManager": 202,
"projectManagerName": "***",
"departmentId": "abc",
"organizationId": "28"
}
}
]