首页 > 解决方案 > 当要传递的列表的任何元素中包含连字符时,Spring Data JPA IN 子句返回超过预期的值

问题描述

在使用 IN 子句获取记录时,以下查询返回的值超过了预期值。

List`<Object>` findAllByCameraIdIn(List`<String>` cameraIds);

我有与弹性数据库中的两个摄像头相关的记录 - [uk05-Smoking-shelter-carpark, uk05-stairway-in]

如果 List cameraIds = ["uk05-Smoking-shelter-carpark"],它会给出与 camera -> uk05-stairway-in 相关的值(两个摄像头),任何想法/建议为什么会这样?

即使我正在调用 db 来过滤记录,预期结果应该只有 7,对应uk05-smoking-shelter-carpark但它也给了我结果uk05-stairway-in

在此处输入图像描述


我的发现

当我用 _ 替换少数记录时,即(uk05-smoking-shelter-carpark with uk05_smoking_shelter_carpark)在 cameraId 中,查询工作正常。

在此处输入图像描述

我相信查询开始搜索具有给定值的所有记录,但是一旦遇到-,它就会忽略-. 任何建议或见解为什么会这样?

标签: spring-bootelasticsearchspring-data-jpa

解决方案


如果未指定分析器,则Elasticsearch 使用标准分析器。假设cameraId字段是text类型,所以uk05-smoking-shelter-carpark将被标记为

{
  "tokens": [
    {
      "token": "uk05",
      "start_offset": 0,
      "end_offset": 4,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "smoking",
      "start_offset": 5,
      "end_offset": 12,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "shelter",
      "start_offset": 13,
      "end_offset": 20,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "carpark",
      "start_offset": 21,
      "end_offset": 28,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

因此,在搜索时"uk05-smoking-shelter-carpark"将匹配具有上述任何标记的所有文档。


  1. 如果要返回与搜索查询完全匹配的文档,则需要将数据类型更改cameraIdkeywordtype

  2. 或者,如果您没有明确定义任何映射,那么您需要将 .keyword 添加到该cameraId字段。这使用关键字分析器而不是标准分析器(注意字段后的“.keyword” cameraId)。

  3. 如果您正在搜索完全匹配的术语,最好使用术语查询。

使用匹配查询搜索查询

{
  "query":{
    "match":{
      "cameraId.keyword":"uk05_smoking_shelter_carpark"
    }
  }
}

使用术语查询进行搜索查询

{
  "query":{
    "term":{
      "cameraId.keyword":"uk05_smoking_shelter_carpark"
    }
  }
}

当您替换-_, ie"uk05_smoking_shelter_carpark"时,这将被标记为

GET /_analyze
{
  "analyzer" : "standard",
  "text" : "uk05_smoking_shelter_carpark"
}

生成的令牌将是

{
  "tokens": [
    {
      "token": "uk05_smoking_shelter_carpark",
      "start_offset": 0,
      "end_offset": 28,
      "type": "<ALPHANUM>",
      "position": 0
    }
  ]
}

在这种情况下,搜索查询将只返回匹配的文档uk05_smoking_shelter_carpark


推荐阅读