使用olivere Elasticsearch v5库判断文档字段是否存在的问题
解决olivere/elastic v5中判断文档字段是否存在的问题
嘿,我之前也踩过这个坑!你搞混了两个不同的API:NewExistsService是用来检查索引是否存在的,而不是判断文档里的字段是否存在。对应Elasticsearch官方exists查询的正确方法其实是NewExistsQuery,它刚好就是接收字段名作为参数的。
下面是一个完整的实现示例,能直接返回true或false来判断指定字段是否存在于目标索引的文档中:
import "github.com/olivere/elastic/v5" func isFieldExists(client *elastic.Client, indexName, docType, fieldName string) (bool, error) { // 构建字段存在查询 existsQuery := elastic.NewExistsQuery(fieldName) // 执行搜索请求,只统计匹配数不返回文档内容 searchResult, err := client.Search(). Index(indexName). Type(docType). Query(existsQuery). Size(0). // 跳过文档内容返回,提升查询效率 Do(context.Background()) if err != nil { return false, err } // 只要有匹配的文档,就说明该字段存在 return searchResult.TotalHits() > 0, nil }
额外说明:
如果你的需求是判断某一篇特定文档里是否存在该字段,只需要在搜索时加上ID(docID)限定查询范围即可,这样就能精准判断单篇文档的字段存在性:
searchResult, err := client.Search(). Index(indexName). Type(docType). ID(targetDocID). // 指定要检查的文档ID Query(existsQuery). Size(0). Do(context.Background())
内容的提问来源于stack exchange,提问作者covfefe
相关产品推荐
相关产品推荐

