gpt4 book ai didi

python - 在 elasticsearch 中索引/搜索 "complex"JSON

转载 作者:太空狗 更新时间:2023-10-29 18:34:07 27 4
gpt4 key购买 nike

我有一些如下所示的 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*
  • 酒吧:瓦尔*
  • somekey1: val1
  • 等等

第二个问题:当我搜索时对于 foo: val5,它匹配仅具有键“foo”的所有对象以及在其结构中其他位置具有 val5 的所有对象。

这是我在 Django 中搜索的方式:

self.searchqueryset.auto_query(self.cleaned_data['q'])

有时结果“还可以”,有时却完全没用。

我可能需要一个指向正确方向的指针,并了解我在这里犯的错误。谢谢!

编辑:我在下面添加了我的最终解决方案作为答案!

最佳答案

可以肯定的是,您首先需要根据您的特定数据并根据您的查询需求制作自定义映射,我的建议是contains_more 应该是nested type。以便您可以对您的字段发出更精确的查询。

我不知道您的字段的确切名称,但根据您显示的内容,一种可能的映射可能是这样的。

{
"your_type_name": {
"properties": {
"foo": {
"type": "string"
},
"metadata": {
"type": "object",
"properties": {
"some_key": {
"type": "string"
},
"someotherkey2": {
"type": "string"
},
"more_data": {
"type": "object",
"properties": {
"contains_more": {
"type": "nested",
"properties": {
"foo": {
"type": "string"
},
"bar": {
"type": "string"
},
"baz": {
"type": "string"
}
}
}
}
}
}
}
}
}
}

然后,正如 mark 在他的评论中已经提到的,auto_query 不会削减它,主要是因为多层嵌套。据我所知,Django/Haystack 不支持开箱即用的嵌套查询,但您可以扩展 Haystack 来支持它。这是一篇解释如何解决这个问题的博客文章:http://www.stamkracht.com/extending-haystacks-elasticsearch-backend .不确定这是否有帮助,但您应该尝试一下,如果您需要更多帮助,请告诉我们。

关于python - 在 elasticsearch 中索引/搜索 "complex"JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30355794/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com