spring-boot - 当要传递的列表的任何元素中包含连字符时,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 中,查询工作正常。
我相信查询开始搜索具有给定值的所有记录,但是一旦遇到-
,它就会忽略-
. 任何建议或见解为什么会这样?
解决方案
如果未指定分析器,则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"
将匹配具有上述任何标记的所有文档。
如果要返回与搜索查询完全匹配的文档,则需要将数据类型更改
cameraId
为keyword
type或者,如果您没有明确定义任何映射,那么您需要将 .keyword 添加到该
cameraId
字段。这使用关键字分析器而不是标准分析器(注意字段后的“.keyword”cameraId
)。如果您正在搜索完全匹配的术语,最好使用术语查询。
使用匹配查询搜索查询
{
"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