弹性搜索:一个具有自定义类型的索引来区分文档模式 VS 多个索引,每个文档类型一个?
Elastic Search: One index with custom type to differentiate document schemas VS multiple index, one per document type?
我没有 ES 经验(我的背景更多是关系数据库),我正在努力实现在我的 Web 应用程序中有一个搜索栏来搜索它的全部内容(或我将要搜索的内容)的目标愿意在 ES 中建立索引)。
实施的架构是 Jamstack,其中包含从 strapi 应用程序(无头 cms)获取内容(有时在构建时,有时在 运行 时)的 gatsby 应用程序。中间开发了一个微服务,将strapi应用中创建的文档写入到ES数据库中。此时,所有文档都只有一个索引,不管是什么类型。
我的问题是,随着应用程序的增长和不同类型文档的创建(有时彼此之间非常不同,例如我可以有一篇文章(新闻)和一家医院)我很难正确查询数据库,因为我在进行查询时必须定义很多特定条件(以涵盖所有类型的文档)。
我的解决方案是只保留一个索引并将查询分解为多个索引,当用户点击搜索按钮时,这些查询是 运行 并且结果将在显示之前连接在一起或将唯一的索引分解成几个,每个文档一个,这让我产生了另一个疑问,是否可以一次查询多个索引并在查询中定义特定的索引字段?
哪种方法最好?我希望我能在这方面表达清楚。
提前致谢。
根据您提供的示例,其中一种类型的文档可以是 news
类型,另一种类型是 hospital
,创建多个索引是有意义的(但您还需要告诉,你有多少种不同的类型)。这两种方法各有利弊,一旦您了解了它们,您就可以根据您的用例选择一种方法。
在我开始列出 pros/cons 之前,您的另一个问题的答案是您可以使用 multi-search API.
在单个搜索查询中查询多个索引
单一索引的优点
- 减少多个索引的管理开销(这就是为什么我问你的应用程序中可能有多少这样的索引)。
- 由于数据集中在一个地方,因此搜索查询的性能更高。
缺点
- 您正在为不同类型的文档编制索引,因此您必须包含一个复杂的过滤器才能获取所需的数据。
- 相关性不会很好,因为您有多种文档会影响相似性算法 (BM25) 的 IDF,并影响相关性。
具有不同索引的优点
- 最好根据属性分离数据,以获得更好的相关结果。
- 您的搜索查询不会很复杂。
- 如果您的数据非常庞大,那么分解数据、获得最佳分片大小和更好的性能是有意义的。
缺点
- 更多的管理开销。
- 如果需要在所有索引中搜索,则必须实现多搜索并等待所有索引搜索结果,这可能是昂贵的。
我没有 ES 经验(我的背景更多是关系数据库),我正在努力实现在我的 Web 应用程序中有一个搜索栏来搜索它的全部内容(或我将要搜索的内容)的目标愿意在 ES 中建立索引)。
实施的架构是 Jamstack,其中包含从 strapi 应用程序(无头 cms)获取内容(有时在构建时,有时在 运行 时)的 gatsby 应用程序。中间开发了一个微服务,将strapi应用中创建的文档写入到ES数据库中。此时,所有文档都只有一个索引,不管是什么类型。
我的问题是,随着应用程序的增长和不同类型文档的创建(有时彼此之间非常不同,例如我可以有一篇文章(新闻)和一家医院)我很难正确查询数据库,因为我在进行查询时必须定义很多特定条件(以涵盖所有类型的文档)。
我的解决方案是只保留一个索引并将查询分解为多个索引,当用户点击搜索按钮时,这些查询是 运行 并且结果将在显示之前连接在一起或将唯一的索引分解成几个,每个文档一个,这让我产生了另一个疑问,是否可以一次查询多个索引并在查询中定义特定的索引字段?
哪种方法最好?我希望我能在这方面表达清楚。
提前致谢。
根据您提供的示例,其中一种类型的文档可以是 news
类型,另一种类型是 hospital
,创建多个索引是有意义的(但您还需要告诉,你有多少种不同的类型)。这两种方法各有利弊,一旦您了解了它们,您就可以根据您的用例选择一种方法。
在我开始列出 pros/cons 之前,您的另一个问题的答案是您可以使用 multi-search API.
在单个搜索查询中查询多个索引单一索引的优点
- 减少多个索引的管理开销(这就是为什么我问你的应用程序中可能有多少这样的索引)。
- 由于数据集中在一个地方,因此搜索查询的性能更高。
缺点
- 您正在为不同类型的文档编制索引,因此您必须包含一个复杂的过滤器才能获取所需的数据。
- 相关性不会很好,因为您有多种文档会影响相似性算法 (BM25) 的 IDF,并影响相关性。
具有不同索引的优点
- 最好根据属性分离数据,以获得更好的相关结果。
- 您的搜索查询不会很复杂。
- 如果您的数据非常庞大,那么分解数据、获得最佳分片大小和更好的性能是有意义的。
缺点
- 更多的管理开销。
- 如果需要在所有索引中搜索,则必须实现多搜索并等待所有索引搜索结果,这可能是昂贵的。