弹性搜索:一个具有自定义类型的索引来区分文档模式与多个索引,每个文档类型一个



我在ES方面没有经验(我的背景更多是关系数据库(,我正在努力实现在我的web应用程序中有一个搜索栏来搜索它的全部内容(或我愿意在ES中索引的内容(的目标。

实现的体系结构是Jamstack,其中gatsby应用程序从strapi应用程序(headless cms(获取内容(有时在构建时,有时在运行时(。在中间,我开发了一个微服务,将strapi应用程序中创建的文档写入ES数据库。目前,所有文档只有一个索引,而不考虑类型。

我的问题是,随着应用程序的发展和不同类型的文档的创建(有时彼此非常不同,例如我可以有一篇文章(新闻(和一家医院(,我很难正确查询数据库,因为我在进行查询时必须定义许多特定条件(以涵盖所有类型的文档(。

我的解决方案是只保留一个索引,并将查询分解为几个索引,当用户点击搜索按钮时,这些查询就会运行,结果会在显示之前连接在一起,或者将唯一的索引分解为几个,每个文档一个,这会使我产生另一个疑问,是否可以同时查询多个索引并在查询中定义特定的索引字段?

哪种方法是最好的?我希望我能在这件事上表明我自己。

提前谢谢。

根据您提供的示例,其中一种类型的文档可以是news,另一种类型是hospital,创建多个索引是有意义的(但您还需要知道您有多少不同的类型(。这两种方法都有优缺点,一旦你了解了它们,你就可以根据你的用例选择一种。

在我开始列出利弊之前,您的另一个问题的答案是,您可以使用multisearch API在单个搜索查询中查询多个索引。

拥有单一指数的优点

  1. 减少了多个索引的管理开销(这就是为什么我问您的应用程序中可能有多少这样的索引(
  2. 更高性能的搜索查询,因为数据存在于单个位置

缺点

  1. 您正在为不同类型的文档编制索引,因此必须包含一个复杂的过滤器才能获得所需的数据
  2. 相关性是不好的,因为你有一个混合的文档,这会影响相似性算法(BM25(的IDF,并影响相关性

具有不同指数的优点

  1. 最好根据数据的属性对其进行分离,以获得更好的相关结果
  2. 您的搜索查询不会很复杂
  3. 如果你有非常大的数据,那么打破数据,获得最佳的碎片大小和更好的性能是有意义的

cons

  1. 更多的管理开销
  2. 如果您需要在所有索引中进行搜索,则必须实现多重搜索并等待所有索引的搜索结果,这可能代价高昂

最新更新