- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个如下所示的数据存储模型:
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 好处(请参阅此问题/答案):
我是否只是想过早过度优化并过度思考一切?你说呢?
最佳答案
您可以像现在一样继续编制索引:
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/
我是一名优秀的程序员,十分优秀!