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
相关产品推荐
相关产品推荐

