我在ES方面没有经验(我的背景更多是关系数据库(,我正在努力实现在我的web应用程序中有一个搜索栏来搜索它的全部内容(或我愿意在ES中索引的内容(的目标。
实现的体系结构是Jamstack,其中gatsby应用程序从strapi应用程序(headless cms(获取内容(有时在构建时,有时在运行时(。在中间,我开发了一个微服务,将strapi应用程序中创建的文档写入ES数据库。目前,所有文档只有一个索引,而不考虑类型。
我的问题是,随着应用程序的发展和不同类型的文档的创建(有时彼此非常不同,例如我可以有一篇文章(新闻(和一家医院(,我很难正确查询数据库,因为我在进行查询时必须定义许多特定条件(以涵盖所有类型的文档(。
我的解决方案是只保留一个索引,并将查询分解为几个索引,当用户点击搜索按钮时,这些查询就会运行,结果会在显示之前连接在一起,或者将唯一的索引分解为几个,每个文档一个,这会使我产生另一个疑问,是否可以同时查询多个索引并在查询中定义特定的索引字段?
哪种方法是最好的?我希望我能在这件事上表明我自己。
提前谢谢。
根据您提供的示例,其中一种类型的文档可以是news
,另一种类型是hospital
,创建多个索引是有意义的(但您还需要知道您有多少不同的类型(。这两种方法都有优缺点,一旦你了解了它们,你就可以根据你的用例选择一种。
在我开始列出利弊之前,您的另一个问题的答案是,您可以使用multisearch API在单个搜索查询中查询多个索引。
拥有单一指数的优点
- 减少了多个索引的管理开销(这就是为什么我问您的应用程序中可能有多少这样的索引(
- 更高性能的搜索查询,因为数据存在于单个位置
缺点
- 您正在为不同类型的文档编制索引,因此必须包含一个复杂的过滤器才能获得所需的数据
- 相关性是不好的,因为你有一个混合的文档,这会影响相似性算法(BM25(的IDF,并影响相关性
具有不同指数的优点
- 最好根据数据的属性对其进行分离,以获得更好的相关结果
- 您的搜索查询不会很复杂
- 如果你有非常大的数据,那么打破数据,获得最佳的碎片大小和更好的性能是有意义的
cons
- 更多的管理开销
- 如果您需要在所有索引中进行搜索,则必须实现多重搜索并等待所有索引的搜索结果,这可能代价高昂