当前位置: 首页 > 知识库问答 >
问题:

Spring数据Elasticsearch未给出预期结果

哈栋
2023-03-14

我正在使用Spring data elasticsearch查询我的elastic文档。我的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",
        }
      }
    ]
  }
}

查看结果集,检查项目名称字段值,如包含方法!它没有检查完整的给定参数<为什么会这样?如何解决这些问题
Add:organizationId和projectName字段设置为fieldData=true

共有2个答案

山越
2023-03-14

我不知道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"
        }
      }
    ]
解飞语
2023-03-14

Spring Data Elasticsearch从方法名派生的查询是一个Elasticsearch字符串查询,具有您注意到的给定参数。对于这些Elasticsearch,分析和解析术语,然后搜索具有相同顺序的这些术语的文档。

您对“团队测试”的查询有两个术语,“团队”和“测试”,您显示的所有文档在项目名称中都有这些术语,因此它们会被返回。

如果您有一个包含“团队测试”的文档,而这两者之间没有其他术语,则会以更高的分数返回。

选择此实现是因为它是在Elasticsearch中搜索时通常期望的。具有带有名称的索引并搜索“Harry Miller”的图像不会找到带有“Harry B. Miller”的文档。

您可以编写一个自定义存储库方法来构建满足您需求的查询,并使用它。或者,如果您总是想对此字段进行精确搜索,可以将其定义为一个关键字字段,以防止解析和分析。

您可以将match_短语查询与此存储库方法定义一起使用(此处仅使用一个参数,您需要添加组织id,但结果查询对于这个小代码示例来说太复杂):

@Query("{\"match_phrase\": {\"projectName\": \"?0\"}}\n")
SearchHits<ProjectEntity> findByProjectName(String name);
 类似资料:
  • 这是我索引中的文档(也可以有几个): 从逻辑上讲,我试图建立这个条件: 我的问题(来自kibana): 我正在与上述范围内的字段的范围查询与上面的其他字段进行比较。但没有得到任何命中!我想检索具有在给定和日期。 在这个领域很缺乏经验,不知道为什么不起作用!请帮助如何修复此查询以做到这一点?

  • 我想根据X列重新划分spark dataframe。假设X列有3个不同的值(X1,X2,X3)。不同值的数量可能会变化。 我希望一个分区包含只有1个X值的记录。也就是说,我想要3个分区,其中1有x=x1的记录,其他的有x=x2,最后一个有x=x3的记录。 我正在做的重新划分 但是,我在DF中的分区并没有像预期的那样出现。由于一个分区为空,第二个分区包含X1的记录,第三个分区同时包含X2和X3的记录

  • 问题内容: 我正在尝试使用python scipy模块中的一个非常基本的示例作为方法,但是没有给出预期的结果。我在pylab模式下使用Ipython。 如果我打印数组“ a”和“ b”的内容,它们是相似的。 期望是:(这将在Matlab中转置结果) 问题答案: NumPy有效地反转了数组的形状。如果数组是一维的,则意味着它无效。 在NumPy中,数组 和 实际上是相同的–它们只是空白不同。您可能想

  • 动机:我正在设计一个access数据库来跟踪我员工的培训状态。每个员工都有基于其角色的培训要求(例如,行政助理必须接受记录管理培训和电话礼仪,而电工必须接受危险安全培训)。我希望能够生成一份报告,显示每个人所需的所有培训,以及完成的培训课程的完成日期。 模式I有以下表格: 人员——列出员工信息,例如姓名、电话、电子邮件;键: 我创建了一个查询来匹配到他们当前的: 这是正确的,并告诉我每个人当前的培

  • 问题内容: 下面是一个简单的Java程序。它具有一个称为“ cnt”的计数器,该计数器递增,然后添加到名为“ monitor”的列表中。“ cnt”由多个线程递增,并且值由多个线程添加到“ monitor”。 在方法“ go()”的末尾,cnt和monitor.size()应该具有相同的值,但它们没有相同的值。monitor.size()确实具有正确的值。 如果通过取消注释已注释的同步块之一并注释