You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Search无法过滤索引JSON中含逗号的特定键记录

问题描述

已通过应用向Azure Search填充数据,在portal.azure.com的Search Explorer中可查看索引数据如下:

{"@odata.context": "https://demosearch.search.windows.net/indexes('<indexname>')/$metadata#docs(*)","value": [{"@search.score": 1,"id": "31","code": "C001105","title": "Demo Course Title 1","creator": "FILE_UPLOAD","events": [{"eventId": 97,"eventStatus": "PLANNING","evtSession": [{"postCode": "AB10 1AB","townOrCity": "Aberdeen City,","dates": {"from": "2022-08-11T08:00:00Z","to": "2022-08-11T11:00:00Z"}}]}]},{"@search.score": 1,"id": "45","code": "C001125","title": "Demo Course Title 2","creator": "FILE_UPLOAD","events": [{"eventId": 98,"eventStatus": "IN_PROGRESS","evtSession": [{"postCode": "BA10 0AN","townOrCity": "Bruton","dates": {"from": "2022-08-11T08:00:00Z","to": "2022-08-11T09:30:00Z"}}]}]}],"@odata.nextLink": "https://demosearch.search.windows.net/indexes('<indexname>')/docs?api-version=2019-05-06&search=%2A&$skip=50"}

尝试用以下curl请求筛选townOrCity为"Aberdeen City,"的记录:

curl --location --request POST 'https://demosearch.search.windows.net/indexes/<indexname>/docs/search?api-version=2019-05-06' \
--header 'api-key: XXXX' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data-raw '{"count":false,"top":0,"skip":30,"search":"*","orderby":"search.score() desc","filter":"(  events/any(evt:  evt/evtSession/any(session:  search.in(session/townOrCity, '\''Aberdeen City,'\'', '\'','\'')  )  )  )","facets":["events/evtSession/townOrCity,count:10000"],"queryType":"full","searchMode":"any"}'

但返回结果为空数组:

{"@odata.context": "https://demosearch.search.windows.net/indexes('<indexname>')/$metadata#docs(*)","@search.facets": {"events/evtSession/townOrCity": []},"value": []}

注:去掉"Aberdeen City"后的逗号时查询正常,但需求需支持带逗号的值,使用如下filter仍无法得到正确结果:

$filter=( events/any(evt: evt/evtSession/any(session: search.in(session/townOrCity, 'Aberdeen City,', ',') ) ) )

需要获取正确的请求负载,或指出是否存在索引配置问题。

解决方案

一、修正请求负载中的错误

1. 调整search.in函数参数

search.in的第三个参数是多值分隔符,第四个是转义符。如果仅需匹配单个带逗号的字符串,应将分隔符设为一个不会出现在目标值中的字符(比如|),避免逗号被误判为分隔符:

events/any(evt: evt/evtSession/any(session: search.in(session/townOrCity, 'Aberdeen City,', '|')))

2. 修正skip参数

你的测试数据仅2条记录,原请求中skip=30会跳过所有结果,这也是返回空的核心原因之一,需改为skip=0。

完整正确的请求负载

{
  "count": false,
  "top": 10,
  "skip": 0,
  "search": "*",
  "orderby": "search.score() desc",
  "filter": "events/any(evt: evt/evtSession/any(session: search.in(session/townOrCity, 'Aberdeen City,', '|')))",
  "facets": ["events/evtSession/townOrCity,count:10000"],
  "queryType": "full",
  "searchMode": "any"
}

二、检查索引字段配置

如果修正后仍无结果,需确认townOrCity字段的索引设置:

  • 确保filterable属性为true:只有可筛选字段才能用于$filter表达式
  • 避免分析器移除逗号:如果使用标准分析器,逗号会被当作分隔符剔除,导致存储值变为Aberdeen City。此时需将字段设为searchable: false(无需全文搜索时),或使用keyword分析器(保留原始字符)。

示例字段配置:

{
  "name": "townOrCity",
  "type": "Edm.String",
  "filterable": true,
  "searchable": true,
  "analyzer": "keyword"
}

内容的提问来源于stack exchange,提问作者Prashant Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 00:24:25