Google Appengine 数据存储和索引的高级搜索算法
Advanced Search algorithm on Google Appengine datastore and indexes
我正在将 Appengine 与 python(2.7 版)一起用于处理工作列表和工作搜索的 Web 应用程序。
后端由一个 "Job" table 组成,它由 20 多个字段组成,例如标题、日期、经验等。我为每个过滤器的排列和组合定义了必要的复合索引。正如您所猜到的,索引的数量很多。
front-end 为用户提供了搜索职位并使用列筛选职位的选项。
这按预期工作,但有以下缺点:
- 搜索性能缓慢
- 搜索分为两部分:内置数据存储过滤,然后是在优化结果之上的自定义过滤。需要自定义过滤才能进一步应用 appengine 不支持的复杂过滤器。
- 爆炸式复合索引
有些列(例如 5)只接受一组值,因此使用它们进行过滤非常简单。虽然其他字段可以具有用户定义的值,因此通过它们进行过滤需要自定义 python 代码。
Jinja 是模板引擎,然后将数据呈现到 html。
高级搜索 + 索引参考:https://cloud.google.com/appengine/articles/indexselection
有没有更好的approach/algorithm在appengine中实现搜索和高级搜索?
您可能需要考虑使用 App Engine 中可用的 Full Text Search API。本质上,当在 Cloud Datastore 中创建实体时,您将创建一个包含实体 ID/Key 和所有可搜索字段的文档,并将其发送到搜索 API 进行索引。对 Datastore 实体的任何更新也需要更新相应的搜索文档。另外,删除实体时,删除相应的搜索文档。
修改应用程序的搜索代码以对索引文档而不是数据存储区查询执行搜索。检索文档 ID 的页面(例如 50)。使用 Datastore Get 获取 50 个实体的数据并显示结果。
根据 documentation -
The Search API lets your application perform Google-like full-text
searches over structured data, and supports Geolocation-based queries.
It can be useful in any application domain that benefits from
full-text search, such as:
与 Datastore 查询相比,这肯定会为您的应用程序用户提供更好的搜索体验。
一旦你实现了这个,你可能能够从数据存储中删除复合索引。
我正在将 Appengine 与 python(2.7 版)一起用于处理工作列表和工作搜索的 Web 应用程序。 后端由一个 "Job" table 组成,它由 20 多个字段组成,例如标题、日期、经验等。我为每个过滤器的排列和组合定义了必要的复合索引。正如您所猜到的,索引的数量很多。
front-end 为用户提供了搜索职位并使用列筛选职位的选项。
这按预期工作,但有以下缺点:
- 搜索性能缓慢
- 搜索分为两部分:内置数据存储过滤,然后是在优化结果之上的自定义过滤。需要自定义过滤才能进一步应用 appengine 不支持的复杂过滤器。
- 爆炸式复合索引
有些列(例如 5)只接受一组值,因此使用它们进行过滤非常简单。虽然其他字段可以具有用户定义的值,因此通过它们进行过滤需要自定义 python 代码。
Jinja 是模板引擎,然后将数据呈现到 html。
高级搜索 + 索引参考:https://cloud.google.com/appengine/articles/indexselection
有没有更好的approach/algorithm在appengine中实现搜索和高级搜索?
您可能需要考虑使用 App Engine 中可用的 Full Text Search API。本质上,当在 Cloud Datastore 中创建实体时,您将创建一个包含实体 ID/Key 和所有可搜索字段的文档,并将其发送到搜索 API 进行索引。对 Datastore 实体的任何更新也需要更新相应的搜索文档。另外,删除实体时,删除相应的搜索文档。
修改应用程序的搜索代码以对索引文档而不是数据存储区查询执行搜索。检索文档 ID 的页面(例如 50)。使用 Datastore Get 获取 50 个实体的数据并显示结果。
根据 documentation -
The Search API lets your application perform Google-like full-text searches over structured data, and supports Geolocation-based queries. It can be useful in any application domain that benefits from full-text search, such as:
与 Datastore 查询相比,这肯定会为您的应用程序用户提供更好的搜索体验。
一旦你实现了这个,你可能能够从数据存储中删除复合索引。