让我用一个例子来解释我的问题。
假设我有三种不同类型的文档,其中包含一些常见字段,即 book、song、magazin
- Book 有
name, author, publisher, pageNumber
etc. - Song有
name, singer, publisher, length
etc. - Magazin 有
name, company, publisher, pageNumber
etc.
如您所见,name 和 publisher 字段是所有三种类型文档的通用字段。 pageNumber 是Magazin 和Book 的特征。其余字段独立于其他类型的文档。
我会将这些数据存储在同一个索引中。我也可以存储这些数据,
使用单一类型,例如 Object,它有一个
category
(Book , Song, Magazin) 字段。我在首次创建索引时提供映射详细信息。因此,在此选项中,book 将具有长度字段,但它将是空的,因为它不是 Book 功能。或 _type 字段上的三种类型的文档。
我的查询和构面将在公共(public)字段上。以下哪种方法的查询和分面时间会更少?
/index/book,song,magazin/-d {myQuery}
是否比
/index/object/-d {myQuery && (category = book || category = song || category = magazin)}
?
感谢您的回答。
最佳答案
Elasticsearch 的类型概念在 Lucene 中不存在。
索引文档时,文档的类型会被索引。然后,当只搜索某些类型时,Elasticsearch 会隐式地为您的查询添加一个针对索引类型的过滤器。
因此,对于您的最后一种方法,除了隐式 _type:object
-filter 之外,您还将拥有 category
-filter 。本质上,如果不在此处使用 Elasticsearch 的类型,您将不会获得任何好处。
关于mapping - Elasticsearch - 跨多种类型的搜索效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20837387/