python - 对多个字段执行 OR 或将这些字段值组合成单个字段名是否更高效

标签 python google-app-engine google-search-api

我有一个如下所示的数据存储模型:

class Project(ndb.Model):
   name = ndb.StringProperty()
   statement = ndb.StringProperty()
   description = ndb.StringProperty()

我们正在从我们的模型数据构建一个搜索 API 实现...所以我将构建搜索 API 文档并将我们的数据存储模型映射到它们。

最终结果是我想从一个查询中搜索所有这三个字段...因此,例如,用户键入“city”,系统应该会找到所有名称中都包含“city”一词的项目、声明或描述

我可以用三个通常与模型一对一映射的字段来定义文档,例如:

fields = [
   TextField(name="name" value=proj.value),
   TextField(name="statement" value=proj.statement)
   HtmlField(name="description" value=proj.description)
]

然后用

查询

"name:city OR statement:city OR description:city"

当然搜索 API 文档说:

The "OR" disjunction is an expensive operation in both billable operations and computation time

所以我的另一个选择是将这些组合成一个可搜索的字段名,例如:

fields = [
   TextField(name="search" value=proj.value),
   TextField(name="search" value=proj.statement)
   HtmlField(name="search" value=proj.description)
]

并查询:

"search:city"

我应该假设后者会表现更好吗?但是这种方法会失去字段名称的区别,并且可能会失去 GAE 团队可能添加的“自定义评分”的 future 好处(请参阅此问题/答案):

Google App Engine Search API

我是否只是想过早过度优化并过度思考一切?你说呢?

最佳答案

您可以像现在一样继续编制索引:

fields = [
   TextField(name="name", value=proj.value),
   TextField(name="statement", value=proj.statement)
   HtmlField(name="description", value=proj.description)
]

注意:您可能希望在索引之前去除 html,除非它确实增加了值(value)

然后使用该值作为查询。如果您不指定字段,您将获得在任何字段中具有匹配项的文档的结果。

your_index.search(query)  # This will match the value of city in any field

如果您有比此处所说的更多的字段,并且不希望这些字段包含在您的搜索中,那么使用一个字段来指定这 3 个的组合值将是可行的方法:

fields = [
   TextField(name="name", value=proj.value),
   TextField(name="statement", value=proj.statement)
   HtmlField(name="description", value=proj.description)
   TextField(name="foo", value=proj.foo)
   TextField(name="bar", value=proj.bar)
   TextField(name="composed_field", value=' '.join((
       proj.value,
       proj.statement,
       proj.description
   ))  # or something like this
]

然后:

your_index.search('composed_field:"%s"' % query)  # Look ma', no OR

关于python - 对多个字段执行 OR 或将这些字段值组合成单个字段名是否更高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23497676/

相关文章:

python: iif 或 (x ? a : b)

Python:对图像中的对象进行分类

python - 使用基于函数的 View 获取 pk_id

python - Google App Engine deferred.defer() 错误 404

google-app-engine - 如何在 Golang 中创建和渲染基本模板?

javascript - 如何在 Google Search Console(网站站长工具)API 版本 3 中完成网站验证?

python - 如何在 pandas 中创建动态 bin

google-app-engine - App Engine 实例的 GCS 入口和导出费用

google-search-api - Google News API 已弃用,现在该使用什么?

java - 我应该如何修改来解析Google新闻搜索文章标题和预览和URL?