ElasticSearch - 过滤类型
Posted
技术标签:
【中文标题】ElasticSearch - 过滤类型【英文标题】:ElasticSearch - Filtering the type 【发布时间】:2017-06-10 04:36:23 【问题描述】:我已将我的 elasticsearch 从 v1.9 升级到 v5,我注意到很多事情都发生了变化。
如果我以 v1.9 为例:以下代码检查对象类型是否与 ObjectAdo
匹配,并过滤 ObjectAdo
中具有 IsDeleted
字段为 false
的项目。
private Func<FilterDescriptor<dynamic>, FilterContainer> Filter()
return b => b.Bool(x => x.Must(m => m.Type(typeof(ObjectAdo)), n => n.Term("IsDeleted", false)));
现在,从 v1.9 升级到 v5 后,我注意到 FilterDescriptor
更改为 QueryContainerDescriptor
并且 FilterContainer
现在是 QueryContainer
。现在我无法执行与以前相同的操作,因为.Type(typeof(ObjectAdo)
不再可用。
所以我想知道是否有替代解决方案来检查对象类型。
https://i.stack.imgur.com/dOPex.png
【问题讨论】:
【参考方案1】:在 Elasticsearch 2.0 中,queries and filters merged into one,具有查询上下文和过滤上下文的概念;当包装在 bool 查询过滤器子句中时,查询/过滤器位于过滤器上下文中,因此不会计算相关性分数并且可以缓存。
NEST 2.x 及更高版本与 Elasticsearch 2.0 中的变化保持一致,并具有可用于查询和过滤上下文的查询(QueryContainer
、QueryContainerDescriptor<T>
等)。
将此应用于您的过滤器,意味着使用 NEST 5.x 将其更改为以下内容
private Func<QueryContainerDescriptor<dynamic>, QueryContainer> Filter()
return b => b.Bool(x => x
.Filter(
f => f.Type(t => t.Value(typeof(ObjectAdo))),
f => f.Term("IsDeleted", false)
)
);
syntax for a type
query has changed a little 采用 lambda 表达式来设置可用选项。
【讨论】:
我已经想通了。不过还是谢谢。我是弹性搜索概念的新手,所以我想知道别名索引(例如:my_blog)如何指向服务器中的多个索引,例如 my_blog-2017-12-06 或 my_blog-2017-12-09。如果你能告诉我就好了。 我已将 Nest 和 ElasticSearch.Net 升级到 v 5.0.0。我尝试使用 Kibana 查询并得到结果,但是从我的 .Net 应用程序查询时,我得到 0 个结果。我想知道问题可能是什么。 @Mark - 查看从 NEST 发送到 Elasticsearch 的查询,并将其与 Kibana 中发送的查询进行比较:elastic.co/guide/en/elasticsearch/client/net-api/current/…。查看用于向索引添加别名的索引别名 API:elastic.co/guide/en/elasticsearch/reference/current/…。这是 NEST 的示例:***.com/a/44147111/1831 再次感谢您的回复。去看看这些。 Russ Cam,你能看看这个吗? ***.com/questions/44601950/elasticsearch-auto-mapping以上是关于ElasticSearch - 过滤类型的主要内容,如果未能解决你的问题,请参考以下文章