Lucene如何查询字段中包含带引号短语(如"ns":100)的文档?
问题原因
你原来的查询无法命中结果主要有两个核心原因:
- 如果你把
json.req.variables存为普通文本类型,Lucene默认分词器会把JSON里的引号、冒号等符号直接过滤,你查询的"\"ns\":100"包含特殊符号,和分词后生成的ns、100两个独立词条完全不匹配 - 如果你的JSON是按结构化嵌套类型索引的,直接对整个
variables字段做字符串匹配本来就不符合结构化字段的查询规则
对应解决方案
场景1:json.req.variables存为纯文本字符串,没有做结构化索引
如果是标准分词器处理的文本字段,直接查询两个词条的邻近匹配即可:
json.req.variables: "ns 100"~2
如果要避免误匹配,建议给该字段增加一个不分词的keyword子字段,使用通配符查询(数据量大时不推荐,性能较低):
json.req.variables.keyword: *\"ns\":100*
场景2:JSON结构做了结构化索引(object/nested类型)
不需要匹配整个字段的字符串,直接按嵌套路径查询对应字段即可:
- 普通object类型,可使用通配符匹配不确定的中间层级:
json.req.variables.*.ns:100
- 多层嵌套不确定路径时,可以用多级通配符:
json.req.variables.**ns:100
- 如果是nested嵌套类型,需要配合nested查询语法(以Elasticsearch的Lucene语法为例):
nested(path: "json.req.variables", query: {match: {"json.req.variables.*.ns": 100}})
内容的提问来源于stack exchange,提问作者rishav
相关产品推荐
相关产品推荐

