【发布时间】:2015-08-02 01:29:17
【问题描述】:
我有一些如下所示的 JSON:我们称该字段为 元数据
{
"somekey1": "val1",
"someotherkey2": "val2",
"more_data": {
"contains_more": [
{
"foo": "val5",
"bar": "val6"
},
{
"foo": "val66",
"baz": "val44"
},
],
"even_more": {
"foz" : 1234,
}
}
}
这只是一个简单的例子。真正的可以变得更加复杂。 键可以出现多次。值也可以是 int 或 str。
现在第一个问题是我不太确定如何在 elasticsearch 中正确索引它,以便可以找到具有特定请求的内容。
我正在使用 Django/Haystack,其中索引如下所示:
class FooIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
metadata = indexes.CharField(model_attr='get_metadata')
# and some more specific fields
还有模板:
{
"foo": {{ object.foo }},
"metadata": {{ object.metadata}},
# and some more
}
然后将使用上面的示例填充元数据,结果将如下所示:
{
"foo": "someValue",
"metadata": {
"somekey1": "val1",
"someotherkey2": "val2",
"more_data": {
"contains_more": [
{
"foo": "val5",
"bar": "val6"
},
{
"foo": "val66",
"baz": "val44"
},
],
"even_more": {
"foz" : 1234,
}
}
},
}
这将进入 elasticsearch 中的“文本”列。
所以现在的目标是能够搜索以下内容:
- foo: val5
- foz:12*
- bar: val*
- somekey1: val1
- 等等
第二个问题: 当我搜索时对于 foo: val5 它匹配所有只有键“foo”的对象和所有在它的结构中其他地方有 val5 的对象。
这就是我在 Django 中搜索的方式:
self.searchqueryset.auto_query(self.cleaned_data['q'])
有时结果“还可以”,有时完全没用。
我可能需要一个指向正确方向的指针,并了解我在这里犯下的错误。谢谢!
编辑:我在下面添加了我的最终解决方案作为答案!
【问题讨论】:
-
前言:我不是 django 用户,只是 ES。我的猜测:
content字段填充了所有数据,因此无法进行特定于字段的匹配。如果你想这样,你需要在你的过滤器/查询中表达出来(但我的猜测是:不使用auto_query)。 -
您的元数据字段是否始终具有相同的结构?
-
@juliendangers 有时它有更多的字段或在数组中包含多个元素 有时没有数组,它可以很平坦。然而,密钥之前是已知的,并且可以有例如多达 30 多种不同的
标签: python json django elasticsearch django-haystack