NEST客户端查询无结果,直接HTTP请求有结果的原因排查
问题原因分析与解决方法
先帮你理清两个请求的核心差异:
- 你用NEST请求的是
http://localhost:9200/myindex/product/_search?typed_keys=true,这里的product是Elasticsearch的文档类型(type) - 直接HTTP请求的是
http://localhost:9200/myindex/_search?typed_keys=true,这个请求会搜索整个myindex索引下的所有文档,不限制类型
核心原因:ES 6.x的类型限制
Elasticsearch 6.x版本已经开始逐步淘汰多类型支持,每个索引只能存在一个文档类型,默认的类型名称是_doc。如果你的myindex索引里的文档并没有使用product这个类型(比如用了默认的_doc),那指定product类型的搜索请求自然返回空结果;而直接搜索整个索引的请求会忽略类型限制,返回所有文档。
另外也有可能是你在创建文档时,错误指定了其他类型,或者索引映射里根本就没有product这个类型。
排查与解决步骤
确认索引的类型信息
执行以下HTTP请求查看myindex的映射结构:GET http://localhost:9200/myindex/_mapping从返回结果里可以清晰看到当前索引实际存在的文档类型是什么。
调整NEST客户端的请求逻辑
- 如果映射里的类型不是
product,修改NEST代码,将搜索的类型指定为实际存在的类型(比如默认的_doc) - 或者直接去掉类型指定,让NEST搜索整个索引,这样就和你直接HTTP请求的逻辑完全一致了
- 如果映射里的类型不是
版本兼容注意事项
NEST 6.0.2和Elasticsearch 6.2.3是兼容的,但要注意客户端的类型操作要贴合ES 6.x的规则,尽量避免多类型相关的写法(毕竟ES 7.x就彻底移除了类型概念)
内容的提问来源于stack exchange,提问作者Tadej
相关产品推荐
相关产品推荐

