Lucene技术问题:查询无法匹配指定字段值的原因排查
解答你的Lucene查询困惑
先帮你把问题拆解清楚,核心原因和疑问点都给你捋明白:
1. StoredField无法被查询的关键原因
Lucene里的StoredField是仅负责存储字段内容,不会创建可检索索引的类型。简单说:它的数据会被存在索引文件里(所以你能在Luke工具中看到字段值),但Lucene没有为它构建查询所需的倒排索引,因此任何针对这个字段的检索都会返回空结果。
而StringField则是专门用于精确匹配的字段类型——它会把字段内容作为一个完整词项创建索引(不分词),所以改成这个类型后,__r_ani:567248953这类精确查询就能正常命中文档了。
2. 字段名以双下划线开头是否有问题?
Lucene对字段名的命名没有特殊限制,双下划线开头的字段名完全合法,不会影响查询逻辑。你之前的查询失败和字段名格式无关,问题完全出在字段类型的选择上。
补充:关于你尝试的几种查询为何无效
__r_ani:567248953:依赖字段的倒排索引,StoredField无索引,无法匹配__r_ani:"567248953":同样需要索引支持,StoredField不具备,所以无效__r_ani:[* TO *]:范围查询也要求字段有索引,StoredField不满足条件,自然无结果
总结一下:如果需要某个字段能被检索到,必须选择会创建索引的字段类型(比如StringField、IntPoint、TextField等,根据数据类型和查询需求选择);如果只是需要存储数据供查询结果返回使用,StoredField才是合适的选择。
内容的提问来源于stack exchange,提问作者Pivoman
相关产品推荐
相关产品推荐

